Назад | Перейти на главную страницу

linux + создать простой процесс Watch Dog в сценарии оболочки

Мне нужно создать процесс сторожевой собаки (будет работать в Linux версии 5.x), который все время будет смотреть в файл /etc/cluster.cf

И если процесс соответствует строке: machineA_is_active в файле cluster.cf

Затем этот процесс выполнит другой скрипт

Мой вопрос - как запустить этот процесс таким образом, чтобы этот процесс работал все время, пока работает Linux -

и если этот процесс не работает, необходимо снова запустить этот процесс

Итак, посоветуйте, пожалуйста, какая основная структура для этого сценария?

(Буду рад, если получу реальный пример)

Я бы не рекомендовал пытаться постоянно поддерживать процесс, чтобы делать это. Есть более простые методы. На вашем компьютере должен быть запущен cron, который является планировщиком периодических задач. Вы можете запланировать периодический запуск процесса, например, раз в минуту, чтобы проверять содержимое файла и делать то, что нужно сделать. Вы можете добавить в crontab что-то вроде этого:

* * * * * /path/to/yourscript

видеть man 1 crontab и man 5 crontab и man 8 cron для получения дополнительной информации о cron.

Еще лучше использовать incron, который позволяет вам указать процесс, который будет запускаться при каждом изменении этого файла. Если у вас установлен incron, вы бы добавили в incrontab что-то вроде этого:

/etc/cluster.cf IN_MODIFY /path/to/your/script

Говоря, что каждый раз, когда /etc/cluster.cf изменяется, запускайте ваш скрипт. видеть man 5 incrontab и man 1 incrontab

Предполагая, что вы используете дистрибутив SysV, создайте сценарий инициализации и поместите его в /etc/init.d.

Посмотрите на любой из уже имеющихся сценариев, чтобы узнать, как отформатировать этот сценарий. Рассмотрим те, которые используют функцию демона. Затем вы использовали бы chkconfig чтобы скрипт запускался при загрузке. Этот сценарий инициализации должен записать свой PID в файл блокировки. Вам понадобится второй «вспомогательный процесс», чтобы проверить PID первого, прочитав файл блокировки и определив, запущен он или нет. Включите логику для снятия блокировки и перезапустите первый процесс, если он не найдет работающий PID.

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

sudo crontab -e

затем поместите эту строку в конец вашего файла crontab (внимание, это будет выполняться каждую минуту каждый день, пока вы снова не измените crontab)

* * * * * /usr/sbin/sample_service

затем CTRL-X, Y, ENTER и перезагрузите компьютер.

это пример такой услуги:

    #!/bin/bash
    #
    # watchdog
    #
    # Run as a cron job to keep an eye on what_to_monitor which should always
    # be running. Restart what_to_monitor and send notification as needed.
    #
    # This needs to be run as root or a user that can start system services.
    #
    # Revisions: 0.1 (20100506), 0.2 (20100507)

    NAME=sample_service
    NAME2=sample_service2
    START=/usr/sbin/$NAME
    START2=/usr/sbin/$NAME2
    NOTIFY=joe@gmail.com
    NOTIFYCC=jim@mail.com
    GREP=/bin/grep
    PS=/bin/ps
    NOP=/bin/true
    DATE=/bin/date
    # MAIL=/bin/mail
    RM=/bin/rm

    $PS -ef|$GREP -v grep|$GREP $NAME >/dev/null 2>&1
    case "$?" in
     0)
     # It is running in this case so we do nothing.
      echo "$NAME is RUNNING OK. Relax."

     $NOP
     ;;
     1)
     echo "$NAME is NOT RUNNING. Starting $NAME and sending notices."
     $START 2>&1 >/dev/null &
     NOTICE=/tmp/watchdog.txt
     echo "$NAME was not running and was started on `$DATE`" > $NOTICE
     # $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
     $RM -f $NOTICE
     ;;
    esac

     # GT06
    $PS -ef|$GREP -v grep|$GREP $NAME2 >/dev/null 2>&1
    case "$?" in
     0)
     # It is running in this case so we do nothing.
      echo "$NAME2 is RUNNING OK. Relax."

     $NOP
     ;;
     1)
     echo "$NAME2 is NOT RUNNING. Starting $NAME2 and sending notices."
     $START2 2>&1 >/dev/null &
     NOTICE=/tmp/watchdog.txt
     echo "$NAME2 was not running and was started on `$DATE`" > $NOTICE
     # $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
     $RM -f $NOTICE
     ;;
    esac

    exit

Есть вещь, единственная задача которой - (заново) запускать другие вещи, ее имя init, и он настраивается через inittab. Чтобы сделать что-то действительно бессмертным, добавьте его в inittab с помощью respawn вариант.

Скрипт простой проверки (кандидат в inittab) может быть так:

while :
do
     grep -q machineA_is_active /etc/cluster.cf && activation_script
     # here one needs to ensure the above wan't fire again
     # - say, by carelessly wiping off /etc/cluster.cf
     # or carefully editing out the triggering record
     sleep $delay
done