2010-09-10 3 views
0

У меня есть этот пользовательский кронтаб (доступ через команду кронтаб -e):Linux кронтаб оленья кожа запустить скрипт

# m h dom mon dow command 
*/3 * * * *   sh /home/FRAPS/Desktop/cronCheck.sh 

Сценарий cronCheck.sh выглядит следующим образом:

#!/bin/sh 
SERVICE='Script' 

if ps ax | grep -v grep | grep -i "$SERVICE" > /dev/null 
then 
    echo "######## $SERVICE service running, everything is fine ##################\n" >> CronReport.txt 
else 
    echo "$SERVICE is not running. Launching it now\n" >> CronReport.txt 
    perl Script.pl 
fi 

Когда я запускаю сценарий (cronCheck.sh) из своего собственного каталога, он работает как шарм, но когда cron запускает его, он всегда работает «# $ SERVICE service, все нормально ###» , несмотря на то, что «Script» не работает.

Спасибо,

ответ

2

Вот еще лучший способ, чтобы написать, что условно:

services=$(ps -e -o comm | grep -cFi "$SERVICE") 
case "$services" in 
    (0) 
     # restart service 
    ;; 
    (1) 
     # everything is fine 
    ;; 
    (*) 
     # more than one copy is running 
    ;; 
esac 

с помощью ps -e -o comm вы избегаете делать глупый предмет grep -v grep, потому что в выводе ps появляется только фактическое имя процесса, а не аргументы. И grep -cFi подсчитывает совпадения и дает вам номер, поэтому вам не нужно иметь дело с статусом выхода конвейера.

Кроме того, как предполагают другие плакаты, вы должны провести этот сценарий, установив переменную PATH.

PATH=/bin:/usr/bin:/sbin:/usr/sbin 
export PATH 

Вы могли бы или не могли бы хотеть, чтобы положить /usr/local/bin в начале этого списка, в зависимости от вашей системы. Не делайте этого, если вам от этого ничего не нужно.

Заключительный совет: при написании сценариев, которые будут выполняться без надзора пользователя (например, заданий cron), рекомендуется положить set -e в начале. Это заставляет их выйти неудачно, если какая-либо команда выходит из строя.

1

Проверка состояния возвращаемого трубы, как это может быть проблематичным. Вы должны либо проверить массив $ PIPESTATUS, либо вы можете передать окончательный grep в wc -l, чтобы подсчитать количество строк.

2

Вам нужно поставить grep -v grepпослеgrep -i "$SERVICE". То, как у вас сейчас, это , гарантированный, чтобы быть правдой.

+1

Это, также, удивительно хрупкое (хотя и не необычно). Например, если какой-либо другой пользователь запускает команду с «Сервис» в любом месте своего имени, ваш сценарий будет думать, что все в порядке. Подумайте, вместо этого, фактически тестирование услуги вверх, например. пытаясь подключиться к нему. – telent

1

cron обычно не настраивает много среды, как пользовательская учетная запись. Возможно, вам придется изменить свой скрипт, чтобы правильно настроить его.

1

Задачи Cron не получают одинаковые настройки среды, которые вы получаете в командной строке - они обычно настраиваются вашей оболочкой при входе в систему - поэтому вы хотите использовать абсолютные, а не относительные пути. (т. е. не предполагайте, что переменная среды PATH будет существовать или быть настроена так же, как и для вас в приглашении оболочки, и не предполагайте, что скрипт будет запущен с установленным PWD в ваш домашний каталог и т. д.) Итак:

  • в вашей записи кронтаба заменить sh с /bin/sh (или удалить его, если cronCheck.sh является исполняемым, то притон линия будет делать).
  • в cronCheck.sh добавить пути к файлу журнала и скрипту perl.

cronCheck.sh должен закончить тем, что что-то вроде:

#!/bin/sh 
SERVICE='Script' 

if ps ax | grep -v grep | grep -i "$SERVICE" > /dev/null 
then 
    echo "######## $SERVICE service running, everything is fine ##################\n" >> CronReport.txt 
else 
    # Specify absolute path to a log file that's writeable for the user the 
    # cron runs as (probably you). Example: /tmp/CronReport.txt 
    echo "$SERVICE is not running. Launching it now\n" >> /tmp/CronReport.txt 

    # Specify absolute path to both perl and the script. Example: /usr/bin/perl 
    # and /home/FRAPS/scripts/Script.pl 
    /usr/bin/perl /home/FRAPS/scripts/Script.pl 
fi 

(опять же вы можете избавиться от бита/USR/бен/Perl, если Script.pl выполнима и имеет путь к . право на Perl в хижину линии)

Смежные вопросы