У меня есть программа, которую я не писал; другой отдел в нашей компании сделал. Предположим, исполняемый файл называется Snafu. Мне нужно иметь возможность запускать его без присмотра и определять, не произошел ли сбой. Это может произойти через 1 миллисекунду после запуска или через 1 час после запуска. Программа представляет собой черный ящик, и она не скажет мне и не подскажет, что она потерпела крах. У меня тоже нет его PID. Помимо поиска вывода ps (скажем, я хочу запустить несколько экземпляров Snafu одновременно), как я могу обнаружить сбой одного экземпляра Snafu? Я запущу его из сценария BASH.
программно обнаружить сбой программы в MacOS?
Ответы (1)
Это во многом зависит от того, как происходит сбой.
- остановится ли, т.е. выход
- будет ли висеть
- это мусор
- и т.д.
Исходя из подхода полного черного ящика, вы никогда не узнаете, когда приложение выйдет из строя, и поэтому невозможно будет на это отреагировать.
В остальном я предполагаю, что snafu
выходит.
Более или менее традиционный способ сделать это:
#!/bin/bash
snafu 1 &
snaf1=$!
snafu 2 &
snaf2=$!
while : ; do
sleep 1
if [ ps $snaf1 ] ; then
echo "snafu 1 still runs"
else
echo "snafu 1 died "
snafu 1 &
snafu1=$!
fi
#same if for snafu 2
done
См. примечание от Луиса Муньоса относительно использования PID, ps и т. д.; но до сих пор многие люди делают это. Также: если вы запустите snafu
из сценария оболочки, у вас будет его PID.
Еще один подход:
#!/bin/bash
set -o monitor
trap what_when_died SIGCHLD
what_when_died(){
#actions to do when a snafu dies
}
snafu 1 &
snafu 2 &
sleep inf
Есть некоторые аспекты поведения, которые вам необходимо учитывать; set -o monitor
заставит оболочку передавать сигнал SIGINT дочерним элементам вместо того, чтобы реагировать на него и т. д.
Я попробовал метод ловушки. Это не сработало по какой-то причине. Я думаю, что программа, которую я тестирую, запускает другую программу.
На этот вопрос есть очень хороший ответ coderhelper.com/questions/696839/…
О.. решить проблему с остановкой?
В вопросе не упоминаются бесконечные циклы, поэтому я не думаю, что их сбивает с толку проблема остановки. Обнаружение сбоев кажется очень разумной и выполнимой задачей.