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

От sar страница справочника:

последняя строка указывает на статистику в масштабе всей системы для всех процессоров

Таким образом, действительно столбцы процента являются средними числами по всем процессорам. physc столбец является общим количеством по всем процессорам.

2
08.09.2014, 00:16
4 ответа

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

sudo thin install

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

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

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

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

2
27.01.2020, 21:52

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

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

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

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

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

#!/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

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

1
27.01.2020, 21:52

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

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

1
27.01.2020, 21:52

Две вещи:

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

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

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

ps можно сбрить ветвление () при помощи в то время как сон 30 вместо в то время как верный; действительно... спите 30; сделанный . :)

3
27.01.2020, 21:52

Теги

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