可能重复:
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
它不会像以前一样继续该计划。终端认为程序已退出,但随后将下一次执行的输出作为终端输入。
这样做的正确方法是什么?
答案 0 :(得分:7)
#!/bin/bash
~/ProgramDir/Program || exec "$0"
此脚本将运行“〜/ ProgramDir / Program”并等待其退出状态。如果状态为0(这意味着bash中的“成功”),则脚本本身终止。否则,如果程序返回非0值或者它以不自然的方式终止(例如它被杀死),脚本将再次启动,就像C中的尾递归一样。
编辑根据R ..的评论更新代码
答案 1 :(得分:2)
当你使用exec
时,shell将完全替换它启动的程序。除非程序第一次在加载时失败,否则程序终止后将没有shell继续while
循环。
我不确定这会如何产生你描述的进一步行为。