Скрипт Crontab в другом каталоге не работает

Скрипт Crontab в другом каталоге не работает

Я пытался обновлять свою кодовую базу ежедневно, используя следующую команду crontab. Но первый шаг сам по себе не работал, когда я его тестировал.

27 15 * * * . cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * . cd /home/covuser/user && . /home/covuser/user/checkout.sh

Файл conf.sh содержит переменную окружения, необходимую для проверки кода. Файл checkout.sh выполняет процесс проверки.

Первая строка должна устанавливать требуемую переменную окружения. Но этого не происходит.

Какую ошибку я допустил в этом? Спасибо заранее.

решение1

Каждая строка в вашем crontab представляет собой отдельную задачу, которая будет запланирована и выполнена независимо.

В вашем случае это означает, что они запускаются в разных сеансах оболочки, поэтому использование файла скрипта для установки некоторых переменных среды в одном задании не повлияет на среду, в которой позже будет выполняться другое задание.

Вам придется изменить свой процесс и запустить оба скрипта в одном сеансе оболочки, а значит, проще всего это сделать в одном задании cron.

Если вам нужна задержка между запусками, вы можете добиться этого, например, с помощью sleepвместо того, чтобы планировать другую задачу с фиксированным более поздним временем.


О, и конечно, как указано в некоторых других комментариях и ответах, вы можете только исходные скрипты с , .чтобы заставить их работать в текущей среде оболочки вместо подоболочки. Однако, cdэто не скрипт, а встроенная команда оболочки, которая всегда запускается в текущей среде оболочки, так что запись . cd somehwereтакже является ошибкой.

решение2

Я полагаю, что проблема в .предыдущем вашем cd.

.(псевдоним fro source) позволяет вам указать источник файла. Это не работает для встроенных оболочек, таких как cd, поскольку они не являются исполняемыми файлами, которые можно указать в источнике.

При объединении двух команд с помощью AND - &&оболочка пропускает любую команду, следующую за командой, которая завершается ошибкой, поскольку они не изменят результирующее значение ( false && true == false). Вы можете заменить &&на a, ;если хотите получить другое поведение.

Это должно сработать:

27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * cd /home/covuser/user && . /home/covuser/user/checkout.sh

Обновлять: Если скрипты зависимы (а я так думаю?), запустите все в одном сеансе. (Для выполнения каждой записи cron будет открыт новый сеанс bash)

27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh && . /home/covuser/user/checkout.sh

Связанный контент