Как отслеживать службу и перезапускать, если она остановлена ​​в 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далеко. Это немного сложно, но очень гибко.

LawrenceC
источник
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/

intika
источник
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.

Гас Фан
источник