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

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

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

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

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

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

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

(Я буду счастлив, если я получу реальный пример)

4 ответа

Решение

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

Есть вещь, чья единственная работа состоит в том, чтобы (пере) начать другие вещи, ее имя 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

Очень простое (не самое элегантное) решение для сторожевого таймера - создать задание 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
Другие вопросы по тегам