Помните об окружающей среде - особенно когда она запускается 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 ${@:+"$@"}
Я уже некоторое время пользуюсь им - этой версией с 2001 года - и она работает для меня. Я использую базовую (Sun Solaris 10) реализацию cron
; могут быть новые функции в новых версиях cron
на других платформах, чтобы сделать это ненужным. (Материал $REAL_HOME
- моя странность; притворяйся, что он говорит $HOME
- хотя это делает некоторые сценарии ненужными для тебя.) .cronfile
отвечает за настройку среды - он делает довольно много, но это моя проблема, а не ваша.