Назад | Перейти на главную страницу

Как мне автоматически перезапустить процесс при перезагрузке сервера / выходе процесса?

На моем сервере Ubuntu я использую Бог для мониторинга некоторых процессов / сценариев Ruby, включая систему очередей.

Бог автоматически проверяет, существует ли один из моих процессов, и перезапускает его. Он также отслеживает использование памяти и правильно действует при возникновении определенных условий. Сегодня я перезагрузил сервер и через некоторое время заметил, что моя очередь не работает. После быстрой проверки я обнаружил, что Бог не перезапускается после перезагрузки сервера (я полагал, что должен).

Как лучше всего гарантировать, что Бог (или общий процесс) автоматически перезапускается при перезагрузке сервера или когда процесс прекращается по какой-либо причине?

Конкретная команда, которую я использую для запуска Бога, такова:

god -c config

Здесь несколько вариантов. Просто перейдите к последнему абзацу, если вам нужна одна рекомендация, вместо того, чтобы читать о других тоже!

Просто перезапустить при перезагрузке легко: добавьте его в /etc/rc.local какие дистрибутивы на основе Debian (и многие другие) запускаются по умолчанию после всего, что указано в других сценариях запуска. Если god не переходит в фоновый режим, вам может потребоваться присоединить & к запросу команды следующим образом:

god -c config &

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

Вы также можете создать свой собственный сценарий инициализации по образцу сценариев в /etc/init.d (и связан с /etc/rc.*', что даст вам более полное решение, так как у вас будет возможность останавливать / запускать службу, когда вам нужно, хотя это не приведет к автоматическому запуску службы для вас без дополнительных сценариев с вашей стороны.

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

Я думаю, что обычно рекомендуемый подход к тому, что вы описали, daemontools (http://en.wikipedia.org/wiki/Daemontools), который также поддерживает перезапуск службы в случае ее смерти. Это немного больше работы, чем использование записи в /etc/initab но в итоге вы получите гораздо более чистый конечный продукт, который должен делать все, что вы задали в своем вопросе. daemontools можно найти в репозиториях практически любого дистрибутива Linux.

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

Если у вас есть root-доступ, создайте сценарий инициализации в /etc/init.d, а затем используйте update-rc.d для создания правильных символических ссылок в каталогах уровня выполнения. Пример сценария будет выглядеть так

 #!/bin/bash
 ### BEGIN INIT INFO
 # Provides:          god
 # Required-Start:    $syslog
 # Required-Stop:     $syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Runs the ruby god meta server.
 # Description:       Runs the ruby god meta server.
 ### END INIT INFO

 start_daemon () {

        nohup start-stop-daemon --start --quiet -m --pidfile /var/run/god.pid \
        --exec  god -- -c config 
        RETVAL=$?
 }

 stop_daemon () {
    start-stop-daemon --stop --quiet --oknodo -m --pidfile /var/run/god.pid 
    RETVAL=$?
 }


 case "$1" in 

 start)
 start_daemon
 ;;
 stop)
 stop_daemon
 ;;
 restart | reload | force-reload )
 stop_daemon
 start_daemon
 ;;
 esac

Если вы обычный пользователь, вы можете использовать cron для запуска процессов во время загрузки, указав время запуска как @reboot

@reboot god -c config

Вам нужно написать сценарий init.d, чтобы он запускал и останавливал god. В качестве примера вы можете использовать любой сценарий из каталога /etc/init.d. Назовите ваш новый скрипт /etc/init.d/god. Затем вы можете запустить

# update-rc.d god defaults

и он должен убедиться, что он запускается и останавливается при загрузке и завершении работы сервера. Вы можете обнаружить, что в Интернете уже есть сценарий init.d для god. Я бы быстро поискал, прежде чем вы сядете писать один.

Чтобы бог перезапускал его при загрузке, вы захотите добавить его в сценарии инициализации. Для этого напишите сценарий, который будет принимать хотя бы start в качестве параметра (чтобы следовать стандартам, вам нужно сделать несколько больше, чем это) и вставьте его в /etc/init.d/. Затем добавьте символическую ссылку с именем S99 в / etc / rc [на любых уровнях выполнения, на которых должен запускаться сценарий].

В идеале, чтобы лучше соответствовать стандартам, скопируйте /etc/init.d/skeleton в другое место в /etc/init.d/ и отредактируйте его по размеру.