2009-02-28 2 views
2

Если я запускаю скрипт с /home/<user>/<dir>/script.sh, как root, cron работает очень хорошо. Но если я запустил скрипт с /root/<dir>/script.sh (как root, снова), cron, похоже, не работает.Cron не запускается из/root

+0

без кода будет получить сложно ;-) –

+0

да, нам нужен код, и мы должны точно знать, как это не работает. –

ответ

2

Я думаю, вам нужно добавить немного больше информации. Я бы предположил, что это вопрос разрешений. Добавьте разрешения файла, каталогов и строки в вашем crontab, чтобы мы могли помочь. Кроме того, если вы помещаете это в/root, выполняете ли вы это в корневом каталоге root?

0

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

Вы можете проверить и посмотреть, ищет ли он относительные файлы или опубликовать сценарий?

С другой стороны, почему бы вам просто не запустить его из домашней папки пользователя?

2

Помните об окружающей среде - особенно при работе от 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 - хотя это делает ненужным для вас какой-то сценарий.) Ответ на установку среды отвечает за настройку среды, но это моя проблема, а не твоя.

3

Запустив различные 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».

0

Другой способ запуска ш скрипт поместить Баш скрипт в /usr/bin каталоге и просто запустить команду bash yourscript.sh без добавления /usr/bin/ каталог