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

Содержание
  1. Как автоматически перезапустить фоновый процесс Linux, если он не работает?
  2. BusyBox init
  3. Linux «Система V» init
  4. systemd
  5. дальнейшее чтение
  6. Как выполнить автоматический перезапуск сервиса Linux
  7. Часто происходит спонтанное падение сервиса. Пользователю приходится заниматься их ручным восстановлением. Проблемы как таковой нет, если это происходит на домашнем компьютере. Даже больше – это хорошо, ведь появляется реальная возможность определить состояние сервиса, выявить неисправности и устранить их. Но совсем другая ситуация, когда дело касается серверов и VPS сервисов, которые должны работать постоянно для обеспечения доступа к веб-сайту или приложению. В этой статье рассмотрим способ настройки автоматического перезапуска сервиса Linux несколькими способами: с помощью скрипта мониторинга периодически запускаемого через cron и в systemd.
  8. Автоматический перезапуск в Systemd
  9. Автоматический перезапуск скриптом
  10. Автоматический перезапуск сервиса Linux
  11. Автоматический перезапуск сервиса в systemd
  12. Автоматический перезапуск сервиса с помощью скрипта
  13. Linux: редактирование systemd юнит-файлов, рестарт сервиса при падении и уведомление на почту
  14. Редактирование systemd-юнит файлов
  15. Скрипт на автоматический рестарт процесса, несколько вопросов

Как автоматически перезапустить фоновый процесс Linux, если он не работает?

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

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

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

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

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

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

BusyBox init

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

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

Linux «Система V» init

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

systemd

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

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

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

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

  • « 3.1.3 система инициализации ». Руководство пользователя Buildroot .

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

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

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

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

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

Читайте также:  Mac os кто использует файл

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

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

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

Я считаю, что легко справиться с собственным процессом с помощью автоматического перезапуска, если я не являюсь суперпользователем системы.

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

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

Источник

Как выполнить автоматический перезапуск сервиса Linux

Часто происходит спонтанное падение сервиса. Пользователю приходится заниматься их ручным восстановлением. Проблемы как таковой нет, если это происходит на домашнем компьютере. Даже больше – это хорошо, ведь появляется реальная возможность определить состояние сервиса, выявить неисправности и устранить их. Но совсем другая ситуация, когда дело касается серверов и VPS сервисов, которые должны работать постоянно для обеспечения доступа к веб-сайту или приложению. В этой статье рассмотрим способ настройки автоматического перезапуска сервиса Linux несколькими способами: с помощью скрипта мониторинга периодически запускаемого через cron и в systemd.

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

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

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

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

$ sudo systemctl status apache2

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

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

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

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

ps -A | grep apache2 || systemctl start apache2

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

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

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

Читайте также:  Объединение разделов жесткого диска windows без потери данных

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

Источник

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

Иногда сервисы ни с того ни с сего падают и приходиться их вручную восстанавливать. Если для пользователя домашнего компьютера это не критично, потому что если сервис падает во время разработки, то это даже хорошо, можно сразу увидеть что есть проблема. Но на серверах и 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

#!/bin/bash
ps -A | grep apache2 || systemctl start apache2

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

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

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

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

Источник

Linux: редактирование systemd юнит-файлов, рестарт сервиса при падении и уведомление на почту

Имеется RabbitMQ сервис, который изредка может упасть.

  1. перезапускать его, если процесс был завершён с ошибкой
  2. отправлять почтовое уведомление об этом событии
Читайте также:  Загрузка fedora с windows

Настроим это всё через systemd-сервис файл самого RabbitMQ (хотя есть и другие варианты, например — с помощью monit , см. Monit: мониторинг и перезапуск NGINX).

Нас интересуют две опции:

  • RestartSec= : задержка при рестарте сервиса
  • Restart= : условие, при которому будет выполняться перезапуск

Допустимые значения для Restart — в таблице:

Table 2. Exit causes and the effect of the Restart= settings on them

Restart settings/Exit causes no always on-success on-failure on-abnormal on-abort on-watchdog
Clean exit code or signal X X
Unclean exit code X X
Unclean signal X X X X
Timeout X X X
Watchdog X X X X

Редактирование systemd-юнит файлов

Дефолтный юнит-файл RabbitMQ создаётся в /lib/systemd/system/rabbitmq-server.service .

Просмотреть его можно с помощью systemctl cat :

Источник

Скрипт на автоматический рестарт процесса, несколько вопросов

У меня на убунтовском сервере поднят игровой сервер, в гайдах к которому советуют перезагружать его каждые 4-5 часов.

Собственно писал скрипт на его автоматический рестарт и возникла пара вопросов, буду благодарен за помощь.

Запускаю сервер в screen:

screen -S game -d -m ./launch_game_server.sh

Сам скрипт: restart.sh

Первый вопрос: правильно ли написан данный скрипт?

Второй вопрос: читал что не советуют убивать процессы kill -9, вроде как остаются какие-то дочерние процессы, которые все равно нагружают систему и если это так, как убить процесс по нормальному?

Третий вопрос: имеет ли смысл ребутать сам сервер (Ubuntu) для профилактики?

1. Нет, неправильно: kill -9 | grep game_server

2. Обычно принятно сначала отправлять SIGTERM, только потом SIGKILL. Дочернии процессы могут остаться всегда, нужно смотреть есть ли он вобще у этого сервера и как их можно идентифицировать — по пользователю, по группе процессов, по имени.

3. Ребутать сам сервер смысла не вижу.

Сделай скрипт в /etc/init.d и добавь в крон service restart. Выясни, нет ли у сервера штатной возможности перезагрузки/отключения (команда, например).

для сервисов, которые не имеют в комплекте нормального инит скрипта, я юзаю runit + простенький скрипт. Далее управление идет командой sv(8). Если что-то надо периодически перезапускать, то добавь в начало команду timeout. Она убъёт процесс, а sv его сам перезапустит.

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

Обычно принятно сначала отправлять SIGTERM

а если SIGTERM не будет успешен, kill завершится с сигналом возврата 1 или 0?

C кодом заверния 1. И выведет на stderr одну из трёх ошибок (см man 2 kill). Но, успешное выполнение kill это просто передача сигнала процессу, а уж завершится процесс или проигнорирует SIGTERM это другое дело.

а уж завершится процесс или проигнорирует SIGTERM это другое дело.

вот как раз это и интересовало

Всё плохо. Используй supervisord или подобное (когда-то были ещё daemontools и т.д.)

Источник

Оцените статью