OSX崩溃时自动重启程序[重复]

Posted

技术标签:

【中文标题】OSX崩溃时自动重启程序[重复]【英文标题】:Restarting program automatically on crash in OSX [duplicate] 【发布时间】:2011-11-07 00:47:57 【问题描述】:

可能重复:How do I write a bash script to restart a process if it dies?

我制作了一个 C 程序,它偶尔会崩溃,但我无法修复它(getaddrinfo 的一些问题,看起来相当自发)。我想在崩溃时重新启动程序。我以为这很容易。我打算用 fork 将有问题的 libcurl 代码分开,并查看如何检测关闭的进程,以便它可以再次分叉。但是,我选择了“简单”选项,尝试重新启动整个程序并从文件中恢复数据。

我试过了:

#!/bin/sh
while true; do
    cd "~/ProgramDir"
    exec "~/ProgramDir/Program"
done

但是当程序因失败而退出时,它会开始将下一次执行输出到终端输入(如果这有意义的话)。所以如果我假装我的程序只是一个 Hello World 程序,那么它会做这样的事情:

bash-3.2$ start.sh
Hello World!
Hello World!
bus error
bash-3.2$ Hello World!
-bash: Hello: command not found
bash-3.2$ Hello World!
-bash: Hello: command not found

它不会像以前那样继续程序。终端认为程序已经退出,但随后将下一次执行的输出带到终端输入。

这样做的正确方法是什么?

【问题讨论】:

您确定正确粘贴了实际的启动脚本(尤其是引号)吗? 这是一个非常糟糕的方法。只需找出程序崩溃的原因并修复它。 【参考方案1】:
#!/bin/bash

~/ProgramDir/Program || exec "$0"

此脚本将运行“~/ProgramDir/Program”并等待其退出状态。如果状态为 0(在 bash 中表示“成功”),则脚本本身终止。否则,如果程序返回一个非 0 值或它不自然地终止(例如,它被杀死),脚本将再次启动自己,就像 C 中的尾递归一样。

编辑:根据 R.. 的评论更新代码

【讨论】:

exec $0。如果你只使用$0,它是没有尾递归优化的递归,即每次你都会得到一个新级别的shell,直到你最终用完进程ID/内存。 效果很好,谢谢。 exec "$0" 有空格时有效。【参考方案2】:

当您使用exec 时,shell 将完全用它启动的程序替换自己。除非程序第一次加载失败,否则程序终止后将没有 shell 来继续 while 循环。

不过,我不确定这会如何产生您所描述的进一步行为。

【讨论】:

以上是关于OSX崩溃时自动重启程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

linux程序崩溃自动重启

pm2 重启策略(restart strategies)

AWS EB 实例崩溃时是不是会自动重启?

win10卸载office2010卸载途中就自动重启重复出现

android-在崩溃或退出时远程重启应用程序

当服务器关闭/崩溃时,Node JS 会自动重启所有永远的 JS 进程