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崩溃时自动重启程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章