Как отслеживать службу и перезапускать, если она остановлена ​​в Linux


24

На самом деле я не уверен, стоит ли мне использовать сценарии оболочки или уже есть какие-то способы. Но какой бы подход мы ни использовали, я бы хотел, чтобы Служба работала постоянно.

Скажем iptablesв качестве примера. Затем ..

  • Всякий раз , когдаiptables услуга stoppedили (другими словами) не работает, я хочу, чтобы это было started(или restarted) .. автоматически всякий раз , когда он остановился (или не работает).
  • Другими словами, я хочу, чтобы Служба работала постоянно.

(Может быть, я мог бы дать честную частоту проверки, если проверка в режиме реального времени является проблемой. Так скажем, каждые 5 минут)

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

  • Есть ли какое-нибудь умное решение, пожалуйста?

Благодарность!


Вы не должны этого делать. Предположим, что сервис плохо настроен, какова будет ваша стратегия? Бесконечный список повторений. Вместо этого вы должны написать скрипт crontab, чтобы alertsвы что-то не работали.
MariusMatutiae

Мне просто любопытно прямое решение для оригинального вопроса. А также, у меня есть Служба, которая просто должна быть всегда, restartedкогда она остановлена, по любой причине. Нет проблем с перезагрузкой.
劇場 期 劇場

1
Ваше собственное предлагаемое решение достаточно разумно. Если вы используете его правильно (выйдите немедленно, если служба уже запущена, предупредите вас, что служба остановлена, чтобы вы могли ее исправить, и т. Д.), Это самый простой способ. Служба, которая автоматически останавливается, является проблемной службой, поэтому в конечном итоге вы должны исправить ее, но в противном случае, в качестве временного патча, скрипта cron или другого сверхпростого демона, который спит большую часть времени, все будет хорошо работать. Есть некоторые инструменты, такие как mmonit.com/monit, но я думаю, что в итоге все они используют похожий подход

@MariusMatutiae, я согласен с вашей точкой зрения, но это зависит от характера службы, и большинство менеджеров процессов отступают после нескольких неудачных перезапусков. Вполне разумно, чтобы процесс завершался естественным образом, и мы хотели бы перезапустить его автоматически, например, работник, который выбирает задание из очереди и завершает работу после каждого запуска. Это также удобный инструмент для системных администраторов, которые страдают от сделанного на заказ кода утечки памяти - ограничивают время жизни процесса и автоматически перезапускают его, прежде чем он может выйти из-под контроля ...
Алекс Форбс

Ответы:


25

Обновление март 2018

Этот ответ сейчас довольно старый, и с момента его написания, systemd выиграл войну pid1 на Linux. Таким образом, вам, вероятно, следует создать системный модуль, если systemd встроен в ваш дистрибутив (а это большинство из них).

Ответ ниже сохраняется для потомков.


Ответ monit выше действителен, но я подумал, что упомяну несколько альтернатив:

Стоит помнить, что ваша операционная система уже решила проблему управления процессами. Традиционно в Linux используется sysvinit, который представляет собой набор скриптов, которые вы видите в init.d. Однако он довольно тупой и не может отслеживать процессы, сценарии init.d сложны и заменяются по уважительной причине.

Более современные операционные системы начинают заменять sysvinit, а лидерами являются Upstart и Systemd. Debian склоняется к systemd, Ubuntu разработал и почти уже перешел на Upstart, и, подобно Debian Redhat / CentOS / Fedora, двигается к systemd. Таким образом, если вы используете ОС, которая уже заменила sysvinit, я бы порекомендовал использовать встроенную. Сценарии гораздо проще написать, чем сценарии инициализации.

Я использовал runit и мне это очень нравится, но проще всего использовать supervisor. Он также очень хорошо документирован, работает практически везде и упакован во все основные дистрибутивы.

Но что бы вы ни делали, пожалуйста, пожалуйста, НЕ используйте сценарий оболочки. С таким подходом так много всего плохого!


как это сделать с помощью sysvinit?
скакун

12

iptablesплохой пример, так как на самом деле это не служба или демон, который работает, а часть ядра. Вы не можете «остановить» iptables, вы можете только дать ему конфигурацию, а «остановить» - дать пустую конфигурацию. Действительно, у меня произошел сбой систем Linux, но настройка переадресации портов iptablesпродолжает работать.

В любом случае, утилита под названием monitбудет делать то, что вы хотите. Если вы используете Debian, это apt-get install monitдалеко. Это немного сложно, но очень гибко.


3

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

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null

Точка зрения MariusMatutiae верна, но мы сделали простой скрипт для мониторинга службы HTTPD и DNS на моем сервере, он работает нормально. Когда сервис отключается, скрипт перезапускает сервис и отправляет нам предупреждение. Если мы получаем множество предупреждений / писем о сервисе, то мы можем провести расследование.
Ранджиткумар Т

1

Альтернативное решение для рабочего стола (KDE):

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

Пример : systemctl status httpd.service

Версия KDE 4: https://store.kde.org/content/show.php?content=101336

Версия KDE 5: https://store.kde.org/p/1190292/


0

Я знаю, что прошло несколько лет с тех пор, как был задан вопрос. но с помощью systemd (в основном доступен с centos и REHL) вы можете запустить эту команду bash с помощью cron, чтобы проверить и перезапустить, если служба не работает.

#!/bin/bash

service=$@
/bin/systemctl -q is-active "$service.service"
status=$?
if [ "$status" == 0 ]; then
    echo "OK"
else
    /bin/systemctl start "$service.service"
fi

сохраните его в каталоге bin и назовите его как monitor. Дайте ему соответствующее разрешение на файл. затем запустить его как

sudo monitor redis

если вы хотите проверить службу Redis и перезапустить / запустить при необходимости.

наконец, добавьте это к своей работе cron.

надеюсь, это поможет


0

Чтобы добавить к длинному списку контроля init / svc, в качестве подкаталога на S6 в блоке появился новый ребенок 66, который управляет сервисом s6 и регистрирует его быстрым, легким и удобным для пользователя способом. Это ссылка на официальную документацию для Obarun-Linux https://web.obarun.org/software

Это часто задаваемые вопросы о том, как использовать это программное обеспечение 66 и понять s6 http://sysdfree.wordpress.com/266

Поскольку в его стабильном выпуске была обнаружена только одна ошибка, связанная с изменениями в ядре с 4.20 -> 5.0, все остальные сообщаемые проблемы были связаны с тем, что люди узнавали что-то новое. Если управление службами должно было стать проще, лучше переключиться на ms-windows (запрет Линуса). Чтобы увидеть в реальной жизни, как это может работать, нужно всего лишь скачать Obarun live.iso и поиграть с ним. Установите службы и включите их 66-скрипты, убивайте их, просматривайте их журналы, останавливайте их и запускайте (пока они включены), объединяйте сервисы в дерево, и деревья сервисов запускаются и останавливаются вместе, имеют сервисы уровня пользователя отдельно из системы. Он хорошо выполняет то, что делает s6, и упрощает использование пуленепробиваемой системы под s6.

Загрузки изображений можно найти здесь: https://web.obarun.org/index.php?id=74 md5 проверить файлы https://repo.obarun.org/iso/

Помимо init и управления сервисами s6 / 66 не имеет никаких зависимостей от чего-либо еще в системе. Это слой базовой системы, позволяющий остальной части программного обеспечения работать самостоятельно, init / svc-mgmt вслепую. Все s6 и 66 написаны на C и не зависят от linux или glibc. Серверы Скарнет (s6 авторы) работают уже почти десять лет без особых пауз в работе собственной пользовательской системы. Alpine, Void и Adelie в настоящее время также имеют программное обеспечение s6 в своих хранилищах, по умолчанию Adelie использует его для надзора за обслуживанием. Пустота теперь также несет 66. Я не знаю, был ли и в какой степени кто-либо портировал s6 на xxBSD или другие системы xxIX.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.