Как получить сервис, который гарантирует, что программа будет работать?

Я сделал службу под названием thin_keep_alive_service в /etc/init.d . Я дал ему права chmod +x . Скрипт выглядит следующим образом:

 #!/bin/bash ### BEGIN INIT INFO # Provides: thin_keep_alive_service # Required-Start: $local_fs $network # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description Keeps Thin servers running # Description: This service checks every 30 seconds if at least # two light weight thin web servers are alive and # restarts them all from the bundle if not. ###END INIT INFO while true do # Store an array of the pids of thin thin_pid_arr=($(pgrep -f thin)) # When there are less than two Thin servers left we reboot them all if [ ${#thin_pid_arr[@]} -lt 2 ]; then cd /root_to_app && bundle exec thin -C /etc/thin/app.yml restart fi #Wait 30 seconds before checking again sleep 30 done 

Он работает, когда я запускаю его как service thin_keep_alive_service start . Но он не запускается в фоновом режиме непрерывно после запуска, так как мои два сервера умирают через некоторое время, а новые не перезагружаются.

Как убедиться, что он работает в фоновом режиме?

4 Solutions collect form web for “Как получить сервис, который гарантирует, что программа будет работать?”

Вы можете установить Thin в качестве сценария уровня выполнения (в /etc/init.d/thin), который запустит все ваши серверы после загрузки.

 sudo thin install 

и настройте файл конфигурации для каждого приложения, которое вы хотите запустить:

 thin config -C /etc/thin/myapp.yml -c /var/... 

Запустите тонкий -h, чтобы получить все опции.

Прочтите тонкую документацию !

Две вещи:

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

  2. Я не знаю, что должен делать bundle exec thin restart который должен выполнять bundle exec thin restart , но так как в противном случае ваш сценарий в порядке, вероятно, проблема кроется там, т.е. этот бит не делает то, что вы думаете. Вы можете поместить set -x в свой скрипт, чтобы убедиться, что он запускает эту команду, когда это необходимо.

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

Ps. вы можете сбрить вилку (), используя while sleep 30 вместо while true; do ... sleep 30; done while true; do ... sleep 30; done while true; do ... sleep 30; done . 🙂

Как уже упоминалось, у вас никогда не должно быть цикла, который блокирует сценарий инициализации.

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

 #!/bin/sh while true do start-service ... sleep 30 done 

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

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

 #!/bin/sh while true do start-service ... # service properly terminated? if ! test -f /var/run/service-id then exit 0 fi sleep 30 done 

Если файл / var / run / service-id удаляется до того, как программное обеспечение «start-service» вернется, то вы добры. Это также означает, что при сбое службы файл не должен автоматически удаляться (очевидно).

Возможно, вы также можете использовать возвращаемое значение услуги. В таком случае вы можете сделать это вместо этого (помните, что работает только в том случае, если сама служба блокируется):

 #!/bin/sh while true do if start-service ... then # service cleanly terminated exit 0 fi sleep 30 done 

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

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

Но, если вы хотите использовать стороннее программное обеспечение, посмотрите на monit и godrb.

  • Статус последнего выхода из скрипта без источника
  • Сделать cp возвращает значение ошибки, если цель существует
  • globbing и $ #
  • Правильный способ добавления учетной записи пользователя через скрипт bash
  • Построение URL-адресов со списком слов и загрузка из URL-адресов с помощью командной строки
  • Как добавить / удалить задания cron по сценарию?
  • Выполнение задания Cron, но не создание туннеля
  • Как использовать `модуль load program / 1.1` в сценарии bash?
  • Почему двойные кавычки и backquotes в сценарии оболочки?
  • Команда Linux для переключения пользователя с паролем в качестве параметра
  • не может скопировать более 29 файлов на целевой сервер, используя сценарий оболочки
  • Linux и Unix - лучшая ОС в мире.