以编程方式检测MacOS上的程序崩溃?

时间:2018-04-07 22:59:24

标签: bash macos crash operating-system fault

我有一个我没写过的节目;我们公司的另一个部门做了。假设可执行文件名为Snafu。我需要能够在无人看管的情况下运行它并检测它是否崩溃。这可能在发射后1毫秒或发射后1小时发生。该程序是一个黑盒子,它不会告诉我或给我一个暗示它已经崩溃的提示。我也没有PID。除了点击ps的输出(让我说我想一次运行几个Snafu实例),我如何检测一个Snafu实例的崩溃?我将从BASH脚本启动它。

1 个答案:

答案 0 :(得分: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

请参阅LuisMuñoz关于使用PID,ps等的评论;但仍然有很多人这样做。另外:如果从shell脚本启动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将使shell将SIGINT传递给子节点而不是对它做出反应等。