Bash 以编程方式检测MacOS上的程序崩溃?
我有一个我没有写的程序;我们公司的另一个部门做了。假设可执行文件名为Snafu。我需要能够在无人值守的情况下运行它,并检测它是否崩溃。这可能发生在发射后1毫秒或发射后1小时。这个程序是一个黑匣子,它不会告诉我或者给我一个它崩溃的暗示。我也没有它的PID。除了将ps的输出变大(假设我想同时运行几个Snafu实例),我如何检测一个Snafu实例的崩溃?我将从BASH脚本启动它。这在很大程度上取决于它是如何崩溃的Bash 以编程方式检测MacOS上的程序崩溃?,bash,macos,crash,operating-system,fault,Bash,Macos,Crash,Operating System,Fault,我有一个我没有写的程序;我们公司的另一个部门做了。假设可执行文件名为Snafu。我需要能够在无人值守的情况下运行它,并检测它是否崩溃。这可能发生在发射后1毫秒或发射后1小时。这个程序是一个黑匣子,它不会告诉我或者给我一个它崩溃的暗示。我也没有它的PID。除了将ps的输出变大(假设我想同时运行几个Snafu实例),我如何检测一个Snafu实例的崩溃?我将从BASH脚本启动它。这在很大程度上取决于它是如何崩溃的 它会停下来吗 它能挂起来吗 它会变成垃圾吗 等等 从完全的黑盒方法来看,您永远不会知
- 它会停下来吗
- 它能挂起来吗
- 它会变成垃圾吗
- 等等
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
有一些行为方面你需要考虑;代码>设置-o监视器将使外壳向孩子们传递信号,而不是对其作出反应等。这个问题有一个很好的答案哦。。解决停止问题?这个问题没有提到无限循环,所以我不认为它们会被停止问题绊倒。检测崩溃似乎是一件非常合理和可行的事情。我尝试了陷阱方法。因为某种原因,这不起作用。我正在测试的程序启动了另一个程序。