Другая среда
Cron передает вашим заданиям минимальный набор переменных среды. Чтобы увидеть разницу, добавьте фиктивное задание, подобное этому:
>* * * * * env /tmp/env.output
Ждать /tmp/env.output
будет создано, затем снова удалите задание. Теперь сравните содержимое /tmp/env.output
с выходом env
запустите в своем обычном терминале.
Распространенной "уловкой" здесь является PATH
переменная среды отличается. Возможно, ваш cron-скрипт использует команду somecommand
найденный в /opt/someApp/bin
, который вы добавили в PATH
в /etc/environment
? cron игнорирует PATH
из этого файла, так что запуск somecommand
из вашего скрипта произойдет сбой при запуске с помощью cron, но он будет работать при запуске в терминале. Стоит отметить, что переменные из /etc/environment
будут переданы заданиям cron, только не переменные, которые cron специально устанавливает сам, такие как PATH
.
Чтобы обойти это, просто установите свой собственный PATH
переменная в верхней части скрипта. Например.
#!/bin/bashPATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin# rest of script follows
Некоторые предпочитают вместо этого просто использовать абсолютные пути ко всем командам. Я не рекомендую этого делать. Рассмотрим, что произойдет, если вы захотите запустить свой скрипт в другой системе, и в этой системе команда находится в /opt/someAppv2.2/bin
вместо. Вам пришлось бы пройти весь сценарий, заменив /opt/someApp/bin
с /opt/someAppv2.2/bin
вместо того, чтобы просто сделать небольшую правку в первой строке скрипта.
Вы также можете установить переменную PATH в файле crontab, которая будет применяться ко всем заданиям cron. Например.
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin15 1 * * * backupscript --incremental /home /root