Linux перезапуск процесса при падении

Обновлено: 04.07.2024

Перезапускает процесс 1721 путем отправки сигнала зависания.

Заставляет демона перезагрузить свой файл конфигурации, отправив

Перезапускает inetd, посылая сигнал номер 1, который является сигналом зависания.

Разница между этим примером и предыдущим - это сигнал вызывается по имени здесь, а не номер.

Конечно, стоит проверить, но вы не можете зависеть от этого поведения для любой данной программы. – Roger Light 1 December 2010 в 18:00 Большое спасибо за ссылку. это то, что я искал. о, я забыл упомянуть, что я могу перезагрузить процесс вроде этого, но он работает только для программ, установленных через apt (например, apache, mysql). тот, который я скомпилировал, не влияет – neziric 1 December 2010 в 18:01

Убийство или повторная настройка демона без перезагрузки

Перезапускает процесс 1721 путем отправки сигнала зависания.

killall -HUP inetd

Заставляет демона перезагрузить свой файл конфигурации, отправив

killall -1 inetd

Перезапускает inetd, посылая сигнал номер 1, который является сигналом зависания.

Разница между этим примером и предыдущим - это сигнал вызывается по имени здесь, а не номер.

Убийство или повторная настройка демона без перезагрузки

Перезапускает процесс 1721 путем отправки сигнала зависания.

killall -HUP inetd

Заставляет демона перезагрузить свой файл конфигурации, отправив

killall -1 inetd

Перезапускает inetd, посылая сигнал номер 1, который является сигналом зависания.

Разница между этим примером и предыдущим - это сигнал вызывается по имени здесь, а не номер.

Убийство или повторная настройка демона без перезагрузки

Перезапускает процесс 1721 путем отправки сигнала зависания.

killall -HUP inetd

Заставляет демона перезагрузить свой файл конфигурации, отправив

killall -1 inetd

Перезапускает inetd, посылая сигнал номер 1, который является сигналом зависания.

Разница между этим примером и предыдущим - это сигнал вызывается по имени здесь, а не номер.

Убийство или повторная настройка демона без перезагрузки

Перезапускает процесс 1721 путем отправки сигнала зависания.

killall -HUP inetd

Заставляет демона перезагрузить свой файл конфигурации, отправив

killall -1 inetd

Перезапускает inetd, посылая сигнал номер 1, который является сигналом зависания.

Разница между этим примером и предыдущим - это сигнал вызывается по имени здесь, а не номер.

Убийство или повторная настройка демона без перезагрузки

Перезагружает процесс 1721, отправив сигнал зависания.

Заставляет демона перезагрузить свой файл конфигурации, отправив сигнал зависания.

Перезапускает inetd, посылая сигнал номер 1, который является сигналом зависания.

Различие между этим примером и предыдущим - это сигнал, называемый здесь именем, а не числом.

Убийство или повторная настройка демона без перезагрузки

Перезагружает процесс 1721, отправив сигнал зависания.

Заставляет демона перезагрузить свой файл конфигурации, отправив сигнал зависания.

Перезапускает inetd, посылая сигнал номер 1, который является сигналом зависания.

Различие между этим примером и предыдущим - это сигнал, называемый здесь именем, а не числом.

Убийство или повторная настройка демона без перезагрузки

Перезагружает процесс 1721, отправив сигнал зависания.

Заставляет демона перезагрузить свой файл конфигурации, отправив сигнал зависания.

Перезапускает inetd, посылая сигнал номер 1, который является сигналом зависания.

Различие между этим примером и предыдущим - это сигнал, называемый здесь именем, а не числом.

Убийство или повторная настройка демона без перезагрузки

Перезагружает процесс 1721, отправив сигнал зависания.

Заставляет демона перезагрузить свой файл конфигурации, отправив сигнал зависания.

Перезапускает inetd, посылая сигнал номер 1, который является сигналом зависания.

Различие между этим примером и предыдущим - это сигнал, называемый здесь именем, а не числом.

Убийство или повторная настройка демона без перезагрузки

Перезагружает процесс 1721, отправив сигнал зависания.

Заставляет демона перезагрузить свой файл конфигурации, отправив сигнал зависания.

Перезапускает inetd, посылая сигнал номер 1, который является сигналом зависания.

Различие между этим примером и предыдущим - это сигнал, называемый здесь именем, а не числом.

Конечно, стоит проверить, но вы не можете зависеть от этого поведения для любой данной программы. – Roger Light 1 December 2010 в 18:00 Большое спасибо за ссылку. это то, что я искал. о, я забыл упомянуть, что я могу перезагрузить процесс вроде этого, но он работает только для программ, установленных через apt (например, apache, mysql). тот, который я скомпилировал, не влияет – neziric 1 December 2010 в 18:01

вы можете использовать следующую команду

, где 1234 - это идентификатор процесса.

Что делает эта строка, так это то, что сначала она копирует командную строку, которая использовалась для запуска этот процесс переходит в переменную, затем он убивает этот процесс и перезапускает его с помощью сохраненной командной строки.

Обновление: выше была обновлена ​​командная строка

Я сильно сомневаюсь, что вы имеете в виду " & amp; " Вот. Несмотря на это, это не сработает. – Roger Light 1 December 2010 в 17:57 Могу ли вы попробовать PLZ сейчас. cmdline in / proc имеет пробелы, замененные нулевыми символами. Я добавил команду для их замены. также использование '& amp;' между командами была опечатка, которую я исправил – binW 2 December 2010 в 10:41

вы можете использовать следующую команду

CMD=`cat /proc/1234/cmdline |sed 's/\x0/ /g'` && kill 1234 && `$CMD` &

, где 1234 - это идентификатор процесса.

Что делает эта строка, так это то, что сначала она копирует командную строку, которая использовалась для запуска этот процесс переходит в переменную, затем он убивает этот процесс и перезапускает его с помощью сохраненной командной строки.

По умолчанию выставлено, что в случае падения сервиса Systemd ничего с ним не будет делать. Но пользователь всегда может выстроить настройки таким образом, чтобы в случае падения или остановки сервис автоматически перезапускался. Для этого используется директива Restart, которую надо добавить в секцию Service. Дальше рассмотрим пример настройки автоматического перезапуска сервиса Apache:

$ sudo systemctl edit apache2

[Service]

Restart=on-failure

RestartSec=5s

настройка автоматического перезапуска сервиса Apache:

Здесь RestartSec указывает, сколько ждать перед перезапуском сервиса. Когда завершите работу, сохраните изменения и выполните команду daemon-reload, чтобы перечитать конфигурацию:

Дальше, чтобы проверить все ли работает исправно, посмотрите состояние процесса, завершите процесс сигналом kill:

$ sudo systemctl status apache2

$ kill -KILL 32091

Процесс сигналом kill

Еще раз посмотрите состояние, процесс должен быть запущен. Для установки запуска инициализации каждый раз, используйте специальную директиву Restart: always. Но пользоваться ею необходимо крайне осторожно, ведь она не позволит завершить процесс, даже если в этом возникнет необходимость. Если процесс постоянно падает, чтобы он перезапускался, можно добавить лимит на количество перезапусков в секцию Service:

$ sudo systemctl edit apache2

[Service]

StartLimitIntervalSec=500

StartLimitBurst=5

Restart=on-failure

RestartSec=5s

Лимит на количество перезапусков в секцию Service

Здесь StartLimitBurst и StartLimitIntervalSec указывают на важность перезапуска сервиса пять раз, и если он все эти пять раз упадёт, то оставить его и не трогать. Вторая директива ограничивает время перезапусков сервиса до 500 секунд.

Автоматический перезапуск скриптом

Пожалуй, самый надежный и безотказный способ, работающий во всех версиях Linux. В том же Apache легко выстроить автоматический перезапуск при помощи скрипта. Для этого необходимо ввести команду:

Файл нужно сохранить и обязательно сделать его исполняемым:

chmod ugo+x /usr/local/bin/apache-monitor.sh

Не забудьте добавить запись в cron для периодического запуска скрипта:

$ sudo crontab -e

*/5 * * * * /usr/local/bin/apache-monitor.sh

На этом все. Да, настроить автоматический перезапуск сервиса не так просто, как может показаться на первый взгляд. Но это важная способность, поэтому ей необходимо уделить внимание – оно того определенно стоит.

Иногда сервисы ни с того ни с сего падают и приходиться их вручную восстанавливать. Если для пользователя домашнего компьютера это не критично, потому что если сервис падает во время разработки, то это даже хорошо, можно сразу увидеть что есть проблема. Но на серверах и VPS сервисы должны работать постоянно для обеспечения доступа к веб-сайту или приложению.

В этой инструкции я покажу как настроить автоматический перезапуск сервиса Linux несколькими способами: с помощью скрипта мониторинга периодически запускаемого через cron и в systemd.

Автоматический перезапуск сервиса в systemd

По умолчанию, если ваш сервис будет убит или завершится некорректно, systemd не будет с ним ничего делать. Но можно настроить сервис так, чтобы при падении или даже остановке он автоматически перезапускался. Для этого используется директива Restart, которую надо добавить в секцию Service. Например, рассмотрим настройку автоматического перезапуска сервиса Apache:

sudo systemctl edit apache2

[Service]
Restart=on-failure
RestartSec=5s


Директива RestartSec указывает сколько ждать перед перезапуском сервиса. Когда завершите сохраните изменения и выполните команду daemon-reload, чтобы перечитать конфигурацию:

sudo systemctl daemon-reload

Затем чтобы проверить что всё работает посмотрите состояние процесса, завершите процесс сигналом kill:

sudo systemctl status apache2
kill -KILL 32091


И снова посмотрите состояние. Процесс будет запущен. Система инициализации автоматически перезапустит его как только он завершится с кодом возврата ошибки. Если вы хотите чтобы процесс перезапускался всегда, необходимо использовать директиву Restart: always. Однако с ней надо быть осторожным, она вовсе не даст вам завершить процесс, даже если будет необходимо. Для того, чтобы процесс, который постоянно падает не перезапускался, можно добавить лимит на количество перезапусков в секцию Service:

sudo systemctl edit apache2

[Service]
StartLimitIntervalSec=500
StartLimitBurst=5
Restart=on-failure
RestartSec=5s

Директивы StartLimitBurst и StartLimitIntervalSec указывают, что надо попытаться перезапустить сервис пять раз, и если он все эти пять раз упадёт, то больше его не трогать. Вторая директива ограничивает время перезапусков сервиса до 500 секунд.

Автоматический перезапуск сервиса с помощью скрипта

Это самый простой и самый надежный способ работающий абсолютно во всех дистрибутивах linux и не требующий установки дополнительных утилит. Для того же Apache скрипт выглядит следующим образом:

sudo vi /usr/local/bin/apache-monitor.sh

Сохраните файл, сделайте его исполняемым:

chmod ugo+x /usr/local/bin/apache-monitor.sh

Теперь добавьте запись в cron для периодического запуска скрипта:

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

У меня есть процесс, который выполняется сценарием init.d на фоне. Например:

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

Конечно, но это зависит от распределения. Практически все они предоставляют своего рода менеджера по обслуживанию. Стандартного дистрибутива нет, но есть buildroot. Так что я должен сделать это вручную .

Самый простой способ - добавить его в / etc / inittab , который предназначен для таких вещей:

respawn Если процесс не существует, запустите процесс. Не ждите его завершения (продолжите сканирование файла / etc / inittab). Перезапустите процесс, когда он умрет. Если процесс существует, ничего не делайте и продолжайте сканирование файла / etc / inittab.

Например, вы можете сделать это:

Обратите внимание, что /etc/inittab работает (или даже существует), если и только если у вас есть система инициализации на основе sysvinit. С upstart и с systemd это не так. Вы должны установить либо busybox (очень примитивная оболочка, делающая sysadm восстанавливающим задачи болезненным, но он может заменить sysvinit-совместимый initd), либо sysvinit (это ископаемое). В докерном контейнере только первое не больно.

У Buildroot есть три возможных системы инициализации, поэтому есть три способа сделать это:

BusyBox init

При этом каждый добавляет запись в /etc/inittab .

Обратите внимание, что BusyBox init имеет уникальный /etc/inittab формат. Второе поле не имеет смысла, а первое поле - это не идентификатор, а базовое имя устройства.

Linux "Система V" init

Снова, каждый добавляет запись к /etc/inittab .

systemd

Один пишет файл модуля, скажем, в /etc/systemd/system/myprocess.service :

Включите это для автоматического запуска при загрузке с:

Запустите его вручную с помощью:

дальнейшее чтение

но когда вы используете этот подход inittab, тогда ваш процесс больше не доступен через интерфейс службы? то есть ты не можешь идти service mything start или service mything stop больше . есть ли способ получить лучшее из обоих? то есть нерасширяемый сервис sysvinit, но можно ли его использовать и через «сервис»?

Как насчет создания подоболочки с циклом, который постоянно вызывает один и тот же процесс?

Если он заканчивается, следующая итерация цикла продолжается и запускается снова.

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

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

Вы могли бы использовать Monit . Это действительно простой в использовании и довольно гибкий. Посмотрите, например, эту конфигурацию для перезапуска процесса Tomcat при сбое.

У этого также есть много примеров конфигурации для многих случаев использования.

Если вы не являетесь суперпользователем или пользователем root, и если в вашей системе Linux установлен Docker, вы можете создать образ докера вашего процесса, используя docker для перезапуска вашего процесса, если система перезагружается.

Чтобы запустить ваш докер-контейнер,

Для примера примера того, как создать образ докера, вот быстрый пример:

В моем случае, как быстрое исправление, я изменил и использовал решение @Trylks, чтобы обернуть программу, которую я запускал. Я хотел, чтобы это закончилось только на чистом выходе.

У меня есть процесс, который выполняется сценарием init.d на фоне. Например:

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

У Buildroot есть три возможных системы инициализации, поэтому есть три способа сделать это:

BusyBox init

При этом добавляется запись в /etc/inittab .

Обратите внимание, что init BusyBox имеет уникальный формат /etc/inittab . Второе поле не имеет смысла, а первое поле - это не идентификатор, а базовое имя устройства.

Linux "System V" init

Опять же, добавляется запись в /etc/inittab .

systemd

Например, вы записываете файл модуля в /etc/systemd/system/myprocess.service :

Включите это для автоматического запуска при загрузке с:

Запустите его вручную с помощью:

дальнейшее чтение

Как насчет создания подоболочки с циклом, который постоянно вызывает один и тот же процесс?

Если он заканчивается, следующая итерация цикла продолжается и запускается снова.

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

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

Самый простой способ - добавить его в /etc/inittab, который предназначен для таких вещей:

Например, вы можете сделать это:

У этого также есть много примеров конфигурации для многих случаев использования.

Если вы не являетесь суперпользователем или пользователем root, и если в вашей системе Linux установлен Docker, вы можете создать образ докера вашего процесса, используя docker для перезапуска вашего процесса, если система перезагружается.

Чтобы запустить ваш докер-контейнер,

Читайте также: