Сценарий оболочки не выполняется из задания cron - PullRequest
0 голосов
/ 14 июня 2011

сценарий оболочки:

#!/bin/sh
services=( httpd named proftpd mysqld dovecot postfix webmin)

for service in ${services[@]}
do

if ps ax | grep -v grep | grep $service > /dev/null
then
    echo "$service service running, everything is fine"     
else
    echo "$service is not running"
    service $service start
fi

done 

файл исполняемый, запускается от пользователя root

Команда:

bash /etc/mycron/checkServices.sh

попробовал sh и просто /etc/mycron/checkServices.sh

не запускается

Ответы [ 2 ]

5 голосов
/ 14 июня 2011
#!/bin/sh
services=( httpd named proftpd mysqld dovecot postfix webmin)

for service in ${services[@]}; do
    if ps ax | grep -v grep | grep $service > /dev/null; then
        echo "$service service running, everything is fine";
    else
        echo "$service is not running";
        service $service start;
    fi;
done;

Хорошо работает здесь ... возможно, вы захотите добавить после #!/bin/sh PATH="/bin:/sbin:/usr/bin:/usr/sbin:/opt/usr/bin:/opt/usr/sbin:/usr/local/bin:/usr/local/sbin"

Вы также можете сделать chmod 775 /etc/mycron/checkServices.sh, чтобы сделать его исполняемым, что необходимо для cron.Тогда вам также не нужно было бы вызывать bash /etc/mycron/checkServices.sh, и вы можете просто позвонить /etc/mycron/checkServices.sh, #!/bin/sh говорит исполняемому загрузчику загрузить файл с /bin/sh, если вы вызываете bash /etc/mycron/checkServices.sh, вы запустите bash, который в свою очередь начнется/bin/sh чтобы наконец выполнить ваш скрипт.

Поскольку цикл for в bash / sh использует переменную IFS ($IFS) в качестве разделителя, вы также можете сделать строку services=(httpd named proftpd mysqld dovecot postfix webmin) как services="httpd named proftpd mysqld dovecot postfix webmin", так какболее общий

1 голос
/ 14 июня 2011

Так же, как и в общем процессе диагностики, целесообразно вставлять в скрипт операторы трассировки, такие как:

  • эхо "Старт ..."
  • echo "Проверка работающей службы '$ service' ..."
  • Какие / Где услуги
  • echo "Служба запущена."
  • временно удалить > /dev/null для ps.

Затем выполните в cron с stdout и stderr, перенаправленными в файл журнала.

Это позволяет вам определить точную линию, которая терпит неудачу. Как уже говорили другие, похоже, что команды «service» или «$ service» не найдены, потому что PATH не настроен на их включение. Вы понимаете, что сам «сервис» ищется как внешняя команда, которая предположительно запускает $ service по очереди? Также следите за почтой root, поскольку cron иногда отправляет отчеты об ошибках по почте.

...