Повторно запустити сценарій програми, коли він вийде з ладу?


18

У мене є кілька додатків, які потрібно постійно працювати на моєму ноутбуці.

Я використовую скрипт bash для запуску цих програм. У моєму сценарії у мене є цикл, схожий на такий:

while true;
do
    xterm
done

Це запускає додаток ( xtermу цьому випадку), і якщо програма виходить з ладу, цикл запускає його знову.

Це має недолік, що немає «чистого» виходу з цієї петлі. Тож навіть якщо намір користувача закрити xterm, цикл запускає його знову.

Чи є спосіб запустити додаток з bash script, подивитися, чи працює він, запустити його заново, якщо скрипт вийшов з ладу або нічого не зробить, якщо користувач закрив його належним чином?

Відповіді:


30

Спробуйте це:

while true; do xterm && break; done

Програми мають коди статусу виходу, так що якщо щось закінчується, воно повертається до нуля ... А якщо щось пішло не так, він викидає інше число. Це дозволяє людям підключитися і дізнатися точну проблему. Це те, що робить інша відповідь.

&&просто перевіряє, що попередня команда була нульовим статусом, і якщо вона була, розбиває цикл. Якщо він вийде з ладу, він викине щось, крім 0, і && ...пункт не запустить; він просто обернеться назад і запуститься xterm.


6
Це досить елегантно.
Олі

Хм .. І навпаки:while xterm; do true; done
muru

1
@muru: Це працює для мене:while ! xterm; do :; done
Сайрус

1
@Cyrus Ага, так. забув !.
муру

Я створив монстра. Як я його вбиваю?
Тоні Рут

6

В whileумові ви можете перевірити, чи статус виходу xtermбув успішним чи ні, чимось подібним:

result=1
while [ $result -ne 0 ]; do
    xterm
    result=$?
done

$? змінна містить статус виходу останньої виконаної команди.


0

Я запропоную вам скористатися.

до xterm; зробити відлуння "програма закінчилася статусом $?" ; зроблено

Це повторно запустить вашу програму, якщо вона буде вбита.


0

Спробуйте скористатися супервізором дуже просто і легко додати програму або сценарій для запуску . У вашому випадку як мінімум вам потрібно commandі, можливо, exitcodesв програмі-розділі для налаштування.

За замовчуванням exitcodes- 0,2, це означає:

supervisord перезапустить процес, якщо він завершиться з кодом виходу, який не визначений у цьому списку

Загалом, це те, що ви хочете: повторно запустіть його, якщо сценарій вийшов з ладу або нічого не зробить, якщо користувач закрив його належним чином (або сценарій успішно завершено)

спершу спробуйте найпростішу конфігурацію:

[program:you_app_name]
command=/path/to/you/app

Для більшої гнучкості див. Конфігураційну документацію файлу .

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