Если я запускаю скрипт с /home/<user>/<dir>/script.sh
, как root, cron работает очень хорошо. Но если я запустил скрипт с /root/<dir>/script.sh
(как root, снова), cron, похоже, не работает.Cron не запускается из/root
ответ
Я думаю, вам нужно добавить немного больше информации. Я бы предположил, что это вопрос разрешений. Добавьте разрешения файла, каталогов и строки в вашем crontab, чтобы мы могли помочь. Кроме того, если вы помещаете это в/root, выполняете ли вы это в корневом каталоге root?
Возможно, это связано с тем, что вы ищете относительные каталоги/файлы в скрипте, которые находятся при запуске из/home /, но не из/root, потому что/root не находится в/home/root и не будет выглядеть как и в домашней папке пользователей в/home/
Вы можете проверить и посмотреть, ищет ли он относительные файлы или опубликовать сценарий?
С другой стороны, почему бы вам просто не запустить его из домашней папки пользователя?
Помните об окружающей среде - особенно при работе от cron
, а не от корня. Когда cron запускает что-то, у вас, вероятно, нет ничего особого в вашей среде, в отличие от того, когда вы запускаете команду через at
. Также неясно, каков будет ваш текущий каталог. Итак, для команд, которые будут выполняться с помощью 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
- хотя это делает ненужным для вас какой-то сценарий.) Ответ на установку среды отвечает за настройку среды, но это моя проблема, а не твоя.
Запустив различные PATH по умолчанию в прошлом при использовании 'cron', я всегда заполняю полный $ PATH для каждого исполняемого файла и каждого целевого файла. Я всегда предполагаю, что «cron» имеет набор NO $ PATH и не имеет текущей текущей рабочей папки.
Другими словами, не используйте команду как
"myprocess abc*.txt"
, но сделать это в полной мере, как
"/usr/localbin/myprocess /home/jvs/abc*.txt".
В качестве альтернативы, создать Баш скрипт, который делает работу, и назвать это Баш скрипт с полным абсолютным путем, таким как
"/usr/local/bin/myprocess_abc_txts".
Если вам нужно иметь некоторую гибкость в сценарии, используйте env которые задаются специально в сценарии bash, который вы вызываете с помощью «cron».
Другой способ запуска ш скрипт поместить Баш скрипт в /usr/bin
каталоге и просто запустить команду bash yourscript.sh
без добавления /usr/bin/
каталог
без кода будет получить сложно ;-) –
да, нам нужен код, и мы должны точно знать, как это не работает. –