Ответов (5)5
Помните об окружении - особенно когда он запускается, cron
а не root. Когда cron что-то запускает, у вас, вероятно, нет ничего особенного в вашей среде, в отличие от того, когда вы запускаете команду через at
. Также неясно, какой будет ваш текущий каталог. Итак, для команд, которые будут запускаться cron
, используйте сценарий (как вы уже делаете) и убедитесь, что он устанавливает достаточно среды для его запуска. И убедитесь, что код настройки вашей среды не является интерактивным!
На моих машинах у меня есть такой механизм, что запись cron читает (например):
23 1 * * 1-5 /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
weekday
Скрипт в Cron
каталоге является ссылкой на стандартный скрипт , который сначала устанавливает окружение и затем запускает команду /work1/jleffler/bin/weekday
(в данном случае - он использует имя команды , чтобы определить , что для запуска).
Фактический сценарий в Cron
каталоге:
: "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
#
# Commands to be performed by Cron (no debugging options)
# Set environment -- not done by cron (usually switches HOME)
. $HOME/.cronfile
base=`basename $0`
cmd=${REAL_HOME:-/real/home}/bin/$base
if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi
exec $cmd ${@:+"[email protected]"}
Я использую его уже некоторое время - эту версию с 2001 года - и она мне очень нравится. Я использую базовую (Sun Solaris 10) реализацию cron
; в новых версиях cron
на других платформах могут появиться новые функции, которые сделают некоторые из них ненужными. (Этот $REAL_HOME
материал - моя странность; представьте, что он говорит $HOME
- хотя это делает часть скрипта ненужным для вас.) The .cronfile
отвечает за настройку среды - он делает довольно много, но это моя проблема, а не ваша.
Это может быть связано с тем, что вы ищете относительные каталоги / файлы в скрипте, которые находятся при запуске из / home /, но не из / root, потому что / root не находится в / home / root и не будет выглядеть как домашняя папка пользователя. дома/
Можете ли вы проверить, ищет ли он относительные файлы или опубликовать сценарий?
С другой стороны, почему бы вам тогда просто не настроить его на запуск из домашней папки пользователя?
В прошлом, столкнувшись с различными $ PATH по умолчанию при использовании cron, я всегда полностью записываю абсолютный $ PATH для каждого исполняемого файла и каждого целевого файла. Я всегда предполагаю, что в cron НЕТ $ PATH и НЕТ текущего рабочего каталога.
Другими словами, не используйте такую команду, как
"myprocess abc*.txt"
но сделай это полностью, как
"/usr/localbin/myprocess /home/jvs/abc*.txt".
В качестве альтернативы создайте сценарий bash, который выполняет эту работу, и вызовите этот сценарий bash с полным абсолютным путем, например
"/usr/local/bin/myprocess_abc_txts".
Если вам нужно иметь некоторую гибкость в сценарии, используйте переменные среды, которые устанавливаются специально в сценарии bash, который вы вызываете с помощью cron.