在OSX中崩溃时自动重启程序

可能重复:
如果进程死了,如何编写bash脚本来重启?

我做了一个偶然崩溃的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 

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

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

 #!/bin/bash ~/ProgramDir/Program || exec "$0" 

该脚本将运行“〜/ ProgramDir / Program”并等待其退出状态。 如果状态为0(这意味着bash中的“成功”),则脚本本身终止。 否则,如果程序返回非0值或者它以不自然的方式终止(例如它被杀死),脚本将再次启动,就像C中的尾递归一样。

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

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

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