Мониторинг процесса pid на изменения

Вопрос или проблема

У меня есть служба, которая всегда должна работать. Я бы хотел знать, когда служба когда-либо останавливается или перезапускается.

Я думал о том, чтобы сослаться на PID службы. Если она перезапустится, у нее будет новый PID. Поэтому я хотел бы отправлять уведомление или электронное письмо всякий раз, когда PID изменяется. Какой наименее навязчивый способ сделать это?

На данный момент у меня есть задача cron, записывающая PID в файл каждые 5 минут. Есть ли инструмент Linux, который может отслеживать изменения PID в этом файле? Или мне следует запустить какой-то другой процесс, например, скрипт на Python, который сможет извлекать этот файл и отслеживать его таким образом?

Винс, для непрерывного мониторинга рекомендую вам рассмотреть решения с открытым исходным кодом, такие как Nagios. На ваш вопрос, ниже приведен BASH-скрипт, prog_stat.sh, который будет записывать DATE и PID в файл каждую секунду. Затем вы можете дополнить скрипт, чтобы анализировать изменения PID и добавлять последующие действия. Нажмите CTRL-C, чтобы остановить.

У меня есть машина для разработки Nagios. Этот скрипт предназначен для этой машины, чтобы проверять PID Nagios каждую секунду. Измените частоту проверки, изменив значение сна.

    #!/bin/bash
    PROG=Nagios          
    LOG=/home/user/nagios_pid.log   
    echo "" > $LOG             
    while true; do    
    PID=`ps ax | grep -i "$PROG" | awk 'NR==1{print $1}'`                  
    echo `date -u` " "  $PID >> $LOG                      
    sleep 1                                               
    done                 
    exit                   

Вывод скрипта

    [user ~]#cat nagios_pid.log
    Sat Mar 30 11:15:50 UTC 2019   1171
    Sat Mar 30 11:15:51 UTC 2019   1171
    Sat Mar 30 11:15:52 UTC 2019   1171
    Sat Mar 30 11:15:53 UTC 2019   1171
    Sat Mar 30 11:15:54 UTC 2019   1171
    Sat Mar 30 11:15:55 UTC 2019   1171
    Sat Mar 30 11:15:56 UTC 2019   1261
    Sat Mar 30 11:15:57 UTC 2019   1261
    Sat Mar 30 11:15:58 UTC 2019   1261
    Sat Mar 30 11:15:59 UTC 2019   1261

Отсортируйте для изменения:

   [user ~]# sort -k 7,7 -u  nagios_pid.log
    Sat Mar 30 11:15:50 UTC 2019   1171
    Sat Mar 30 11:15:56 UTC 2019   1261

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

-Марк

Если ваша система контролируется systemd, а многие современные системы это делают (введите systemctl, чтобы проверить, так ли это), вы можете настроить его на выполнение действий, когда служба перезапускается. Этот ответ на ServerFault приводит лишь один пример.

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

Ответ или решение

Чтобы мониторить процесс и отслеживать изменения его идентификатора процесса (PID), существует несколько эффективных подходов. Ваша цель заключается в том, чтобы уведомлять о том, когда служба останавливается или перезапускается. Рассмотрим возможные решения подробно:

1. Сценарий Bash для мониторинга PID

Вы предложили использование скрипта, который записывает PID процесса в файл с заданным интервалом. Вот улучшенная версия вашего скрипта, которая отслеживает изменения PID и отправляет уведомления:

#!/bin/bash
# Определяем переменные
PROGRAM="имя_вашей_службы" # Укажите имя службы, которую хотите отслеживать
LOG="/path/to/your/pid_log.log" # Путь к файлу лога

# Удаляем старый лог файл, если он существует
[ -f $LOG ] && rm $LOG

# Начальное значение PID
PREV_PID=""

while true; do
    CURRENT_PID=$(pgrep -f "$PROGRAM") # Получаем текущий PID через pgrep

    # Проверяем наличие PID
    if [ -n "$CURRENT_PID" ]; then
        TIMESTAMP=$(date -u)
        echo "$TIMESTAMP - PID: $CURRENT_PID" >> $LOG
        # Если PID изменился, то отправляем уведомление
        if [ "$CURRENT_PID" != "$PREV_PID" ]; then
            echo "Уведомление: PID процесса изменился с $PREV_PID на $CURRENT_PID в $TIMESTAMP"
            PREV_PID=$CURRENT_PID
            # Здесь можно добавить команду для отправки уведомления, например, посредством email или сторонних систем мониторинга
        fi
    else
        echo "$(date -u) - Процесс $PROGRAM не запущен" >> $LOG
    fi
    sleep 1 # Интервал между проверками
done

2. Использование Cron

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

Вы можете использовать inotify или file watcher, чтобы отслеживать изменения файла логов, но это потребует большей настройки и может оказаться более сложным решением.

3. Системный менеджер systemd

Если ваша система использует systemd (что характерно для большинства современных дистрибутивов Linux), вы можете воспользоваться его могучими возможностями для мониторинга служб. Вы можете настроить systemd так, чтобы он отправлял уведомления при перезапуске службы. Вот пример конфигурационного файла для службы:

[Unit]
Description=Описание вашей службы

[Service]
ExecStart=/path/to/ваша_служба
Restart=always
RestartSec=5
# Добавьте строку для уведомления в случае перезапуска
ExecStartPost=/path/to/уведомление_о_перезапуске.sh

[Install]
WantedBy=multi-user.target

В этом примере ExecStartPost будет запускать ваш скрипт уведомления каждый раз, когда служба будет перезапущена, что обеспечивает достаточно простую и эффективную настройку.

Заключение

В зависимости от вашей системы и требований, используйте предложенные варианты мониторинга службы. Выбор между скриптом Bash, cron, и функционалом systemd должен основываться на необходимости в сложности, количестве системных ресурсов, и уровне уведомлений, который вы хотите получить. В случае более сложных бизнес-решений, рассмотрите использование инструментов мониторинга, таких как Nagios или Prometheus, для централизованного управления службами и получения отчётов.

Эти подходы обеспечат надёжный мониторинг вашей службы и помогут быстро реагировать на изменения в её состоянии и работоспособности.

Оцените материал
Добавить комментарий

Капча загружается...