Вопрос или проблема
У меня есть служба, которая всегда должна работать. Я бы хотел знать, когда служба когда-либо останавливается или перезапускается.
Я думал о том, чтобы сослаться на 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, для централизованного управления службами и получения отчётов.
Эти подходы обеспечат надёжный мониторинг вашей службы и помогут быстро реагировать на изменения в её состоянии и работоспособности.