Создание сценария Bash, который будет выполнять программу и, если она завершится без сбоев, запустит ее снова

8

Я хотел бы знать самый простой способ создания bash-скрипта, который будет запускать приложение в MacOSX (это система на основе UNIX, поэтому я предположил, что это правильное место). дождитесь выхода программы. Если выход не был сбоем, запустите его снова. В противном случае оставьте окно отчета о сбое открытым и выйдите.

Я бы хотел, чтобы этот скрипт работал вечно, пока не произойдет сбой или ручное завершение.

У меня есть смутная идея, но я не уверен. Вот что у меня так далеко:

echo "Launching Autorun…"

if ["$1" -eq "0"]; then
# Application exited successfully. Restarting.
/path/to/application.app
else
# An error occured. Do nothing and exit.
    exit
fi
Бен сошел с ума Euden
источник
Вы почти наверняка не хотите, чтобы скрипт работал вечно по любой причине. Вы хотите, чтобы служба - или демон - работала вечно. Я не знаю, как они это делают на Apple, но вам, вероятно, стоит присмотреться к своей системе инициализации, чтобы выяснить, есть ли способ зарегистрировать службу в ней. Обычно демоны периодически сами рексуют для обновления / сохранения состояния - на самом деле они не зацикливаются вечно.
mikeserv

Ответы:

12

Вот что делают циклы Bash while :

while /path/to/application.app
do
    :
done

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

Однако, похоже, что то, что вы запускаете, может быть обычным приложением Mac ( .app): в этом случае возникает пара проблем. Во- первых, вам нужно использовать openкоманду , а не работает каталог приложений непосредственно: open /path/to/application.app.

Другое - то, что когда вы это делаете open, обычно сразу завершается успешно, независимо от того, что приложение продолжает делать: это не совсем универсально, но большинство так и будет. Если один делает, вы можете использовать -Wопцию , чтобы заставить openне блокировать до конца приложения: open -W /path/to/application.app. Обратите внимание, что если приложение уже запущено, оно будет ждать, пока существующее выполнение также не прекратится.

Насколько серьезна проблема, зависит от того, какое приложение вы используете. Если это не очень хорошо, делать это из оболочки, возможно, не лучший вариант. В этом случае вам, вероятно, лучше использовать AppleScript, о котором вы можете спросить в Ask Different .

Майкл Гомер
источник
У меня есть приложение на Mac, которое может преднамеренно завершить работу, с которым я проверил ваше решение выше. оно автоматически перезапустит приложение даже после сбоя. Есть ли способ проверить выход из приложения? поскольку open, очевидно, завершится с выходом 0, то будет выполняться снова независимо.
Бен сошел с ума Euden
@BenCrazedUpEuden: Насколько я понимаю, openвозвращается только сбой при определенных ошибках запуска. Приложения запускаются системной службой, а не напрямую, поэтому прямого канала связи нет. Иногда это возможно , чтобы запустить исполняемый файл приложения непосредственно: /Applications/YourProgram.app/Contents/MacOS/YourProgram. В противном случае мы выходим из Unix и в те места, где вы получите лучший ответ на Ask Different . Вы можете запустить AppleScript из оболочки с помощьюosascript
Майкл Гомер
0

Я проверил это:

#!/bin/bash
while <your_cmd_here>
do
    true
done

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

fduff
источник