Cron не запускается из / root - PullRequest
1 голос
/ 01 марта 2009

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

Ответы [ 5 ]

3 голосов
/ 01 марта 2009

Когда в прошлом использовался 'cron', когда я сталкивался с различными $ PATH по умолчанию, я всегда записывал абсолютный $ PATH для каждого исполняемого файла и каждого целевого файла. Я всегда предполагаю, что у 'cron' нет установленного $ PATH и нет текущего рабочего каталога.

Другими словами, не используйте команду типа

       "myprocess  abc*.txt"

но делайте это в полном объеме как

        "/usr/localbin/myprocess    /home/jvs/abc*.txt".

Либо создайте сценарий bash, который выполняет эту работу, и вызовите этот сценарий bash с полным абсолютным путем, например

       "/usr/local/bin/myprocess_abc_txts".

Если вам нужно иметь некоторую гибкость в сценарии, используйте переменные окружения, которые устанавливаются специально в сценарии bash, который вы вызываете с помощью cron.

2 голосов
/ 01 марта 2009

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

2 голосов
/ 01 марта 2009

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

0 голосов
/ 03 октября 2012

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

0 голосов
/ 01 марта 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...