Повторно запустить скрипт приложения, когда он падает?

18

У меня есть несколько приложений, которые должны постоянно работать на моем ноутбуке.

Я использую скрипт bash для запуска этих приложений. В моем сценарии у меня есть цикл, который выглядит примерно так:

while true;
do
    xterm
done

Это запускает приложение ( xtermв данном случае), и если приложение вылетает, цикл запускает его снова.

Это имеет недостаток в том, что нет «чистого» выхода из этого цикла. Таким образом, даже если намерение пользователя - закрыть xterm, цикл запускает его снова.

Есть ли способ запустить приложение из bash-скрипта, посмотреть, запущено ли оно, перезапустить его, если скрипт рухнул, или ничего не делать, если пользователь закрыл его правильно?

Dictador
источник

Ответы:

30

Попробуй это:

while true; do xterm && break; done

Приложения имеют коды состояния выхода, так что если что-то выходит нормально, оно возвращает ноль ... А если что-то пошло не так, оно выбрасывает другое число. Это позволяет людям подключиться и выяснить точную проблему. Это то, что делает другой ответ.

&&просто проверяет, что предыдущая команда была выходом с нулевым статусом и, если это так, прерывает цикл. Если && ...произойдет сбой, он выдаст что-то отличное от 0, и предложение не сработает; это будет просто возвращаться и бежать xterm.

Кир
источник
6
Это довольно элегантно.
Оли
Хм .. И наоборот:while xterm; do true; done
Муру
1
@muru: Это работает для меня:while ! xterm; do :; done
Cyrus
1
@ Cyrus Ах, да. забыла !.
Муру,
Я создал монстра. Как мне это убить?
Тони Рут
6

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

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

$? переменная содержит состояние выхода последней выполненной команды.

Леонид Васильевич Федоренчик
источник
0

Я предложу вам использовать.

до xterm; сделать эхо "программа завершилась со статусом $?" сделано

Это перезапустит вашу программу, если она будет убита.

Аравинд Экан
источник
0

Попробуйте использовать supervisor очень просто и легко добавить программу или скрипт для запуска . В вашем случае, как минимум, вам нужно, commandи, возможно, exitcodesв разделе Programx для настройки.

По умолчанию exitcodes0,2, значит,

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

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

попробуйте сначала самую простую конфигурацию:

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

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

Максим Шатов
источник