программно обнаружить сбой программы в MacOS?

avatar
duuuuxq
7 апреля 2018 в 22:59
171
1
2

У меня есть программа, которую я не писал; другой отдел в нашей компании сделал. Предположим, исполняемый файл называется Snafu. Мне нужно иметь возможность запускать его без присмотра и определять, не произошел ли сбой. Это может произойти через 1 миллисекунду после запуска или через 1 час после запуска. Программа представляет собой черный ящик, и она не скажет мне и не подскажет, что она потерпела крах. У меня тоже нет его PID. Помимо поиска вывода ps (скажем, я хочу запустить несколько экземпляров Snafu одновременно), как я могу обнаружить сбой одного экземпляра Snafu? Я запущу его из сценария BASH.

Источник
LMC
8 апреля 2018 в 00:16
2

На этот вопрос есть очень хороший ответ coderhelper.com/questions/696839/…

Martin James
8 апреля 2018 в 11:31
0

О.. решить проблему с остановкой?

Mattie
8 июля 2018 в 12:41
0

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

Ответы (1)

avatar
Ljm Dullaart
8 апреля 2018 в 10:32
0

Это во многом зависит от того, как происходит сбой.

  • остановится ли, т.е. выход
  • будет ли висеть
  • это мусор
  • и т.д.

Исходя из подхода полного черного ящика, вы никогда не узнаете, когда приложение выйдет из строя, и поэтому невозможно будет на это отреагировать.

В остальном я предполагаю, что 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 дочерним элементам вместо того, чтобы реагировать на него и т. д.

duuuuxq
8 апреля 2018 в 20:48
0

Я попробовал метод ловушки. Это не сработало по какой-то причине. Я думаю, что программа, которую я тестирую, запускает другую программу.