【问题标题】:programmatically detect a crash of a program on MacOS?以编程方式检测 MacOS 上的程序崩溃?
【发布时间】:2018-09-17 15:54:43
【问题描述】:

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

【问题讨论】:

  • 这个问题有很好的答案stackoverflow.com/questions/696839/…
  • 哦..解决停机问题?
  • 这个问题没有提到无限循环,所以我认为他们不会被停止问题绊倒。检测崩溃似乎是一件非常合理且可行的事情。

标签: bash macos crash operating-system fault


【解决方案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

请参阅 Luis Muñ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 传递给孩子,而不是对其做出反应等。

【讨论】:

  • 我尝试了陷阱方法。由于某种原因,这不起作用。我认为我正在测试的程序会启动另一个程序。
猜你喜欢
  • 2019-06-10
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多