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

У меня rc.local загружает скрипт при запуске. Хотите знать, если эта служба дает сбой, есть ли способ ее автоматического перезапуска?

1
задан 27 May 2016 в 16:31

1 ответ

Вместо использования /etc/rc.local для продолжительных сервисов создайте systemd сервис. Как пример, создать /etc/systemd/system/foo.service, содержа:

[Unit]
Description=Foo

[Service]
Type=simple
ExecStart=/usr/bin/sleep 10
Restart=always

[Install]
WantedBy=default.target

Это создает сервис, который перезапустит команду, когда она умрет. Замена ExecStart с Вашей командой.

После создания этого файла сделайте:

sudo systemctl daemon-reload
sudo systemctl enable foo.service
sudo systemctl start foo.service

Первая команда скажет systemctl искать новые сервисные определения. Второе включает сервис согласно условиям запуска, которые он имеет (в этом случае, для запуска с default.target, так, чтобы это запустилось при начальной загрузке). Последняя команда запускает сервис для этой сессии.


Для Type:

Если установлено на simple (значение по умолчанию, если ни один Type= ни BusName=, но ExecStart= указаны), ожидается, что процесс настроил с ExecStart= основной процесс сервиса. В этом режиме, если процесс предлагает функциональность другим процессам в системе, должны быть установлены ее каналы передачи, прежде чем демон запущен (например, снабжает сокетом настроенный systemd, через активацию сокета), в то время как systemd сразу продолжится стартовые последующие единицы.

Если установлено на forking, ожидается, что процесс настроил с ExecStart= будет звонить fork() как часть его запуска. Родительский процесс, как ожидают, выйдет, когда запуск будет завершен, и все каналы передачи настраиваются. Ребенок продолжает работать как основной процесс демона. Это - поведение традиционных демонов UNIX. Если эта установка используется, рекомендуется также использовать PIDFile= опция, так, чтобы systemd мог определить основной процесс демона. systemd возобновит стартовые последующие единицы, как только родительский процесс выходит.

Так, если Ваши ветвления команды, то используйте Type=forking и набор PIDFile если Вы можете.


Для WantedBy, выполненный systemctl list-units | grep target найти другие доступные цели, которые можно использовать для более мелкомодульного управления.

3
ответ дан 28 May 2016 в 02:31

Другие вопросы по тегам:

Похожие вопросы: