Как контролировать и автоматически перезапускать процесс?

34

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

Я не понял, как это настроить.

  1. Какой самый простой способ реализовать такую ​​функциональность?
  2. Как это настроить?
opc0de
источник

Ответы:

29

Этот ответ относится к версиям Ubuntu с Upstart (<= 14.10). Используйте другой подход для версий с Systemd (> = 15.04).

Кажется, вы ищете функциональность, уже предоставленную в Ubuntu с Upstart . Раздел respawnв конфигурации будет делать именно то, что вам нужно. Я бы рекомендовал против использования менее стандартного способа борьбы с этим.

Без более подробной информации о процессе, которым вы пытаетесь управлять, трудно сказать, как должна выглядеть конфигурация. Это зависит от того, разветвляется ли он и помещается ли, например, в фоновом режиме. Документация Upstart по respawnразделу должна дать вам больше информации.

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

пример

Предположим, мы хотим, чтобы приложение «Калькулятор» работало, даже если оно было убито огнем (сигнал 9).

  1. Создайте файл конфигурации в /etc/init/calculator.conf(на основе этой статьи ):

    #!upstart
    description "Calculator"
    
    # Start job via the daemon control script. Replace "gert" with your username.
    exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator'
    
    # Restart the process if it dies with a signal
    # or exit code not given by the 'normal exit' stanza.
    respawn
    
    # Give up if restart occurs 10 times in 90 seconds.
    respawn limit 10 90
    
  2. Запустите это, запустив

    sudo start calculator
    
  3. Он открывается на вашем текущем дисплее ( :0) и наслаждайтесь удивительностью, видя, как он перезапускается после закрытия.

    • Определите идентификатор процесса, например, выполнив ps aux | grep calculator:

      gert  13695 0.2 0.4 349744 16460 ?   Sl   13:38   0:00 /usr/bin/gnome-calculator
      
    • Убей его огнем.

      sudo kill -9 13695
      
    • Посмотрите, как оно появляется снова:

      gert  16059 4.6 0.4 349736 16448 ?   Sl   13:40   0:00 /usr/bin/gnome-calculator
      

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

gertvdijk
источник
Я получаю неизвестную работу, когда пытаюсь ее запустить? любая идея. я поместил файл в / etc / init
opc0de
@ opc0de Имя файла servicename.confдолжно соответствовать команде для запуска start servicename. Я подозреваю, что вы выбрали другое имя.
gertvdijk
Нет, это соответствует, но я не последовал вашему примеру, поэтому я думаю, что у меня может быть синтаксическая ошибка.
opc0de
@ opc0de Ну, для начала объясните больше о том, что вы пытаетесь выполнить в вопросе: например, какое приложение / процесс и как вы его выполняете, а также подробности о вашей текущей попытке.
gertvdijk
Решенным на вашем примере моей ошибкой было то, что я, вероятно, допустил ошибку в предварительном заявлении. Спасибо за вашу помощь!
opc0de
13

Очень простой инструмент, который может достичь того же эффекта без необходимости настройки immortal: https://immortal.run/

Просто выполните команду следующим образом:

immortal <cmd>

Он будет работать в фоновом режиме и автоматически перезапустится, если выйдет.

  • immortalctl: Просмотр статуса запущенных заданий. Здесь nameбудет напечатан столбец, который можно использовать для ссылки на задание с другими командами управления.
  • immortalctl stop <name>: Прекращает мониторинг задания с заданным именем (оно не будет автоматически перезапущено, но текущий процесс продолжит выполняться)
  • immortalctl -k <name>: Отправляет SIGKILL текущему процессу.
  • immortalctl exit <name>: Останавливает мониторинг задания с указанным именем и удаляет его из списка заданий.
extropic двигатель
источник
1
Спасибо, это отлично сработало для моего варианта использования в 16.04. Положив это в мою сумку полезных инструментов.
Квентин
2
Действительно, это выглядит более легким, чем выскочка / респаун.
Шридхар Сарнобат
Есть ли способ заставить его отображаться stdoutи stderrна переднем плане?
Дэвид С.
Я не знаю об этом, так как он обычно используется для запуска процесса в фоновом режиме. Тем не менее, вы можете использовать immortalctl -l out.log <cmd> && tail -f out.logдля достижения того же эффекта.
Extropic-двигатель
@DavidS. Вы можете получить комбинированный журнал или иметь stdout и stderr immortal.run/post/stderr
nbari
1

Если вам не нужны функции демона / службы / фонового процесса и вы просто хотите сделать это в консоли, то создайте файл с именем autorestart.sh:

#!/bin/bash

while [ 1 ]; do
  some_command
done

Затем ./autorestart.shавтоматически перезапустится, some_commandесли он выйдет или выйдет из строя. CTRL-C прерывает цикл и полностью закрывает программу.

Проверено на Ubuntu 18.04.

Ян Свенцкий
источник
0

Есть путь без "Upstart". Ключевое слово "inittab" :-). Хотя этот файл обычно не изменяется по умолчанию, его можно использовать для достижения желаемого повторного вызова на машинах SYSV.

cepal67
источник
Я не понимаю, почему кто-то отклонил это решение. Если вы этого не понимаете, просто погуглите; бессмысленно вырезать и вставлять сюда страницы руководства initttab, вы можете сами прочитать их в своей системе! просто наберите "man inittab" ...
cepal67
13
Высококачественные ответы детализируют больше, чем «используйте это, разберитесь сами» :)
Сет
0

ps-watcher - это инструмент, который отслеживает, какие процессы запущены, и выполняет действие при определенных обстоятельствах. Давайте установим это:

apt-get install ps-watcher

Подробности смотрите в нижней части раздела Запуск HHVM с отступлением к PHP-FPM - для меня это хорошо работает.

Firegarden
источник
Поскольку это не очень долго, пожалуйста, добавьте краткое изложение кода вместо статьи, потому что только очень короткий раздел относится к этому вопросу.
derHugo
0

Начиная с Ubuntu 15.04 процессы запуска и перезапуска управляются «systemd», хорошее введение можно найти здесь

https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal

пример, с которого можно начать, доступен на

https://www.devdungeon.com/content/creating-systemd-service-files

Этот подход заменяет старые, основанные на / etc / inittab и upstart.

Николаус Коррелл
источник