Cron не запускается из / root

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

Ответов (5)

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

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

Помните об окружении - особенно когда он запускается, 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.