У меня есть процесс, который выполняется сценарием init.d на фоне. Например:
case "$1" in
start)
/bin/myprocess &
stop)
killall myprocess
restart)
killall myprocess
/bin/myprocess &
esac
В определенных условиях myprocess может завершиться с ошибкой и вернуться. Есть ли (стандартный) способ, как обнаружить его сбой и автоматически перезапустить?
Ответы:
Самый простой способ - добавить его в / 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
:Включите это для автоматического запуска при загрузке с:
Запустите его вручную с помощью:
дальнейшее чтение
источник
service mything start
илиservice mything stop
больше .... есть ли способ получить лучшее из обоих? то есть нерасширяемый сервис sysvinit, но можно ли его использовать и через «сервис»?Как насчет создания подоболочки с циклом, который постоянно вызывает один и тот же процесс?
Если он заканчивается, следующая итерация цикла продолжается и запускается снова.
Если подоболочка умирает, все кончено. Единственной возможностью в этом случае будет создание другого процесса (я назову его некромантом), который проверяет, жив ли ваш процесс, запускает его, если это не так, и запускает этого некроманта с помощью cron, чтобы вы могли регулярно это проверять.
Следующим шагом будет интересно, что произойдет, если cron умрет, но в какой-то момент вы должны чувствовать себя в безопасности и перестать беспокоиться
источник
Вы могли бы использовать Monit . Это действительно простой в использовании и довольно гибкий. Посмотрите, например, эту конфигурацию для перезапуска процесса Tomcat при сбое.
У этого также есть много примеров конфигурации для многих случаев использования.
источник
Если вы не являетесь суперпользователем или пользователем root, и если в вашей системе Linux установлен Docker, вы можете создать образ докера вашего процесса, используя docker для перезапуска вашего процесса, если система перезагружается.
Файл: docker-compose.yml
Чтобы запустить ваш докер-контейнер,
Я считаю, что легко справиться с собственным процессом с помощью автоматического перезапуска, если я не являюсь суперпользователем системы.
Для примера примера того, как создать образ докера, вот быстрый пример:
Файл: Dockerfile
источник
В моем случае, как быстрое исправление, я изменил и использовал решение @Trylks, чтобы обернуть программу, которую я запускал. Я хотел, чтобы это закончилось только на чистом выходе.
Должен работать в большинстве снарядов:
источник
Вы можете использовать рестартер
На более новых системах используйте systemd, который решает все эти тривиальные проблемы
источник