Скрипт не работает в crontab, но работает в терминале - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь запустить bash-скрипт в crontab на Centos 5.5, но я не вижу его в роли pid (pid -e).Сам сценарий использует команду awk для отслеживания текущего журнала для ключевого слова, затем отправляет электронное письмо, а затем, когда сервер снова подключается, отправляет электронное письмо с подтверждением:

tail -fn0 user | awk '
    !server_down && /disconnect_tcp_conn/ { 
        system("mail -s \"server down\" mail@gmail.com </dev/null") 
        print "server down"
        server_down = 1 }
    server_down && /daemon apps started/ {
        system("mail -s \"server's back!\" mail@gmail.com </dev/null") 
        print "Server's back!"
        server_down = 0 }' 

Первоначально у меня возникли проблемы с запускомскрипт пока терминал был закрыт.Кто-то предложил использовать setsid следующим образом:

setsid server_mon.sh >/dev/null 2>&1 < /dev/null &

И это прекрасно работает ... пока не получится.По какой-то причине, через некоторое время, например, через день, скрипт больше не отправляет уведомления.Итак, я подумал создать cronjob для скрипта.

Не будучи знакомым с bash shell и не очень программистом, я каждую минуту тестировал скрипт в cron, чтобы проверить, правильно ли я его использую:

* * * * *  /var/log/server_mon.sh

Не сработало.Было бы только сказать:

"/tmp/crontab.XXXXmu99ii" 19L, 760C written
crontab: installing new crontab

Пытался использовать rc.local .. не может.Я думаю, что версия centos слишком старая (5.5), плюс, возможно, crontab - это путь, потому что я мог бы захотеть выяснить, в какой момент уведомления перестают работать, и соответственно настроить работу cron ... по крайней мере доу меня есть время, чтобы исправить это.

попытался добавить путь к команде awk в сценарии: / usr / bin / awk Все еще без pid.

попытался добавить следующие изменения из того, что я нашел в Интернете:

setsid bash -lic 'cd /var/log && exec SLR_reaper.sh -start' </dev/null &>/dev/null &

не работал и не уверен, что это правильно.

Мой ожидаемый результат - получить это:

setsid server_mon.sh >/dev/null 2>&1 < /dev/null &

каким-то образом вызываться crontab:

@reboot /var/log/server_mon.sh

       *or*

* * * * * /var/log/server_mon.sh

Просто чтобы увидеть, как это работает.

Было бы замечательно любое направление или помощь.Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.Спасибо!

Снимок экрана журнала, отправленного на почту: введите описание изображения здесь

1 Ответ

1 голос
/ 15 мая 2019

Так что решение было довольно простым.Мне просто нужно было указать путь к файлу, за которым следил скрипт, в самом скрипте:

tail -fn0 /var/log/user | /usr/bin/awk '
    !server_down && /disconnect_tcp_conn/ {
        system("mail -s \"server is down XXX.XXX.XXX.XXX\" mail@gmail.com </dev/null")
        print "server is Down XXX.XXX.XXX.XXX"
        server_down = 1 }
    server_down && /daemon apps started/ {
        system("mail -s \"Server is up XXX.XXX.XXX.XXX\" mail@gmail.com </dev/null")
        print "Server is Up XXX.XXX.XXX.XXX"
        server_down = 0 }'

Файл журнала сообщил, что не может найти файл, который указывает на то, что он связан с путемпроблема.

Раньше скрипт читал:

tail -fn0 user | /usr/bin/awk '

Теперь я добавил полный путь:

tail -fn0 /var/log/user | /usr/bin/awk '

Престижность @EdMorton, чтобы сказать мне, чтобы отслеживать журнал изатем укажите полный путь в скрипте.Я не осознавал, что это было необходимо, потому что скрипт находился в том же каталоге, что и «пользователь».

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