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

时间:2011-08-30 17:49:37

标签: c macos bash shell terminal

  

可能重复:
  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

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

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

2 个答案:

答案 0 :(得分:7)

#!/bin/bash

~/ProgramDir/Program || exec "$0"

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

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

答案 1 :(得分:2)

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

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