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

Mat*_*ell 5 c macos bash shell terminal

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

我做了一个偶然崩溃的C程序,我无法解决它(getaddrinfo的一些问题,这是一个相当自发的看似).我想在崩溃时重启程序.我觉得这很容易.我打算用fork分离有问题的libcurl代码,并查看如何从关闭中检测进程,以便可以再次分叉.但是,我选择了"轻松"选项,尝试重新启动整个程序并从文件中恢复数据.

我试过这个:

#!/bin/sh
while true; do
    cd "~/ProgramDir"
    exec "~/ProgramDir/Program"
done
Run Code Online (Sandbox Code Playgroud)

但是当程序退出失败时,如果有意义,它会开始输出下一次执行到终端输入.所以,如果我假装我的程序只是一个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
Run Code Online (Sandbox Code Playgroud)

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

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

etu*_*rdu 7

#!/bin/bash

~/ProgramDir/Program || exec "$0"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 使那个'exec $ 0`.如果你只使用`$ 0`,那么它的递归没有尾递归优化,即你每次都会获得一个新的shell级别,直到你最终耗尽进程ID /内存. (4认同)