Простой способ перезапустить сбойные процессы?

10

Мне нужно контролировать несколько процессов, запущенных на моем веб-сервере. По какой-то причине лак в настоящее время падает один раз в день или два. Я использую monit для автоматического перезапуска лака, но он не работает. Вот моя запись в monit.conf для Varnish.

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

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

У кого-нибудь есть предложения, как я могу это исправить? Или, что еще лучше, можете ли вы предложить другие простые способы автоматического мониторинга и перезапуска аварийных процессов? Спасибо!

Lin
источник
я не могу поверить, насколько трудными были такие вещи в предсистемные времена.
Fl0v0

Ответы:

17

Я бы заглянул в daemontools ( http://cr.yp.to/daemontools.html ).

Supervise был создан именно для этой цели - запускать процессы и наблюдать за ними, перезапуская их немедленно, если они когда-либо прекратятся.

Вы можете по-прежнему использовать monit, если вам нужно сделать что-то более сложное, чем простая проверка «все еще работает», и если процесс нужно перезапустить, то сделайте это с помощью supervise.

Ян Клелланд
источник
Я также использую daemontools для мониторинга нестабильных процессов служб. Очень удобно, если бы мне пришлось сказать. :-)
edomaur
4

Вы также можете использовать / etc / inittab для перезапуска мертвых процессов, используя действие возрождения .

Смотрите раздел inittab на http://aplawrence.com/Unixart/startup.html

Шон Чин
источник
2

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

Если для запуска лака требуется разрешение root (обычно это делают скрипты init.d), измените "/etc/init.d/varnish start" на "sudo /etc/init.d/varnish start". Но этого, вероятно, будет недостаточно, поскольку вы, вероятно, не захотите запускать какие-либо пользовательские мониторы, так как общие привилегии sudo nopasswd для всех команд и передача sudo сценарию оболочки будут в основном такими же плохими. Поэтому вам нужно выяснить, каким командам в этом скрипте инициализации требуется sudo, дать этим командам привилегии sudo в файле / etc / sudoers пользователю monit и, наконец, соответствующим образом отредактировать этот скрипт init. Или, может быть, вместо всего этого лака может быть запущен как пользователь без полномочий root?

Наконец, я уверен, что вы это знаете, но я все равно скажу это. Вы явно вкладываете в это много усилий, я надеюсь, что вы приложите столько же усилий, чтобы выяснить, почему лак падает и на самом деле его исправить (или вынудить разработчиков выяснить, почему) :-)

Обновление:
это может быть не так чисто, но простой способ сделать это с правами суперпользователя - установить скрипт, который проверяет, в порядке ли процесс, и если нет, запускает его. Затем просто запускайте этот скрипт каждые пару минут в качестве задания cron.

Кайл Брандт
источник
Сначала я рассматривал Nagios, но хотел что-то маленькое и простое для моих целей. И да, я смотрю на проблему лака. Один из моих серверов долгое время работал стабильно, так что это определенно связано со мной. :(
Лин
1

Еще один замечательный метод взят из StackOverflow :

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

Это может быть добавлено в crontab:

crontab -e

Затем добавьте правило, чтобы запустить скрипт монитора:

@reboot /usr/local/bin/myservermonitor

Или добавлен как скрипт в /etc/init.d

Посмотрите ответ StackOverflow для подробного объяснения того, почему это хороший подход.

Кори Кляйн
источник
0

Я также искал самый простой способ справиться с этой проблемой. Самый простой способ, который я мог бы найти, это просто добавить Restart=allwaysк соответствующему .serviceфайлу /etc/systemd/system/multi-user.target.wants/последнюю строку [service]тега.

После этого сделать sudo systemctl daemon-reloadзатем sudo systemctl restart service.serviceперезагрузить изменения.

Вы можете проверить, проверив, работает ли служба:, systemctl status processnameпроверьте отметку времени запуска. После этого ps -ef | grep servicename, объявление убивает процесс с только что найденным идентификатором kill 1234. после этого сделайте еще systemctl status processnameраз и проверьте, обновлена ​​ли начальная отметка времени.

Это должно работать на:

  • Debian 7 и Debian 8
  • Ubuntu 15.04 и новее
  • CentOS 7 и будущие
Родо
источник