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


34

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

Я не розумів, як це налаштувати.

  1. Який найпростіший спосіб отримати такий функціонал?
  2. Як це налаштувати?

Відповіді:


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 з належною підтримкою User Job.


Я отримую невідому роботу, коли я намагаюся її почати? будь-яка ідея. я помістив файл у / etc / init
opc0de

@ opc0de Ім'я файлу servicename.confмає відповідати команді для запуску start servicename. Я підозрюю, що ви вибрали інше ім’я.
gertvdijk

Ні, це відповідає, але я не наслідував вашого прикладу, тому я думаю, що у мене може виникнути синтаксична помилка.
opc0de

@ opc0de По-перше, поясніть докладніше про те, що ви намагаєтеся виконати у запитанні: який саме додаток / процес та як, наприклад, запустити, а також деталі про вашу поточну спробу.
gertvdijk

Вирішений вашим прикладом, моя помилка полягала в тому, що я, мабуть, помилився у статистиці exec. Спасибі за вашу допомогу!
opc0de

13

Надзвичайно простий інструмент, який може досягти такого ж ефекту, не потребуючи конфігурації immortal: https://immortal.run/

Просто виконайте команду так:

immortal <cmd>

Він запуститься у фоновому режимі та автоматично перезапуститься, якщо він вийде.

  • immortalctl: Перегляд стану запущених завдань. Тут є nameнадрукований стовпець, який ви можете використовувати для позначення завдання з іншими командами управління.
  • immortalctl stop <name>: Зупиняє моніторинг завдання з вказаним іменем (воно не буде автоматично перезапущено, але поточний процес буде продовжуватись виконувати)
  • immortalctl -k <name>: Надсилає SIGKILL до поточного процесу.
  • immortalctl exit <name>: Зупиняє моніторинг роботи із заданим іменем та видаляє її зі списку завдань.

1
Дякую, це спрацювало чудово для мого використання в 16.04. Поклавши це в мій мішок корисних інструментів.
Квентін Скусен

2
Дійсно, це виглядає легше, ніж прискорене / відновлене.
Шрідхар Сарнобат

Чи є спосіб, щоб його відобразити stdoutі stderrна передньому плані?
Девід С.

Мені про це невідомо, оскільки він зазвичай використовується для запуску процесу у фоновому режимі. Однак ви можете використовувати immortalctl -l out.log <cmd> && tail -f out.logдля досягнення того ж ефекту.
екстропік-мотор

@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.


Я не розумію, чому хтось відхилив це рішення. Якщо ви цього не розумієте, просто погуглити його; безглуздо вирізати і вставити сюди чоловічі сторінки initttab, ви можете самі їх прочитати у своїй системі! просто наберіть "man inittab" ...
cepal67

13
Висока якість відповідей детальніше, ніж "використовувати це, розібратися самостійно" :)
Сет

0

ps-watcher - це інструмент, який спостерігає за запущеними процесами та виконує дію за визначених обставин. Давайте встановимо його:

apt-get install ps-watcher

Детальніше див. У нижній частині Running HHVM with backback to PHP-FPM - це добре працювало для мене.


Оскільки це не дуже довго, будь ласка, додайте резюме коду замість статті, оскільки до цього питання стосується лише дуже короткий розділ.
derHugo

0

Процесами запуску та повторного панування керує "systemd", оскільки Ubuntu 15.04, хороший вступ можна знайти тут

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.