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)
它不会像以前那样继续该计划.终端认为程序已退出但随后将下一次执行的输出作为终端输入.
这样做的正确方法是什么?
#!/bin/bash
~/ProgramDir/Program || exec "$0"
Run Code Online (Sandbox Code Playgroud)
该脚本将运行"〜/ ProgramDir/Program"并等待其退出状态.如果状态为0(这意味着bash中的"成功"),则脚本本身终止.否则,如果程序返回非0值或者它以不自然的方式终止(例如它被杀死),脚本将再次启动,就像C中的尾递归一样.
编辑:根据R ..的评论更新代码