问题描述
我希望有一个进程,如果它崩溃将重新启动。我google了一下,发现一个简单的解决方案是使用daemontools。
我不明白如何配置它。
-
实现这种功能的最简单方法是什么?
-
如何配置?
最佳解决方案
此答案适用于具有Upstart的Ubuntu版本(< = 14.10)。对Systemd版本使用另一种方法(> = 15.04)。
看来你正在寻找已经在Ubuntu中使用Upstart提供的功能。配置中的respawn
节将完全满足您的需求。我建议不要使用不太标准的方法来处理这个问题。
如果没有关于您尝试使用它的流程的更多详细信息,很难说配置应该是什么样子。这取决于它是否分叉并将其置于背景中。 respawn
节的Upstart文档应该为您提供更多信息。
不幸的是,还不能正确运行用户工作:cannot get upstart to run user job
例子
让我们假设我们想要让Calculator应用程序运行,即使它被火烧死(信号9)。
-
在
/etc/init/calculator.conf
中创建配置文件(基于this article):#!upstart description "Calculator" # Start job via the daemon control script. Replace "gert" with your username. exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator' # Restart the process if it dies with a signal # or exit code not given by the 'normal exit' stanza. respawn # Give up if restart occurs 10 times in 90 seconds. respawn limit 10 90
-
通过运行启动它
sudo start calculator
-
它会在您当前的显示屏上打开(
:0
),并在关闭它后重新启动它,享受真棒。-
识别进程ID,例如做
ps aux | grep calculator
:gert 13695 0.2 0.4 349744 16460 ? Sl 13:38 0:00 /usr/bin/gnome-calculator
-
用火杀死它。
sudo kill -9 13695
-
看着它再次出现:
gert 16059 4.6 0.4 349736 16448 ? Sl 13:40 0:00 /usr/bin/gnome-calculator
-
请注意,对于具有适当用户作业支持的Ubuntu 13.04计划的计划,这将更加优雅。
次佳解决方案
无需配置即可实现相同效果的极其简单的工具是immortal
:https://immortal.run/
只需执行如下命令:
immortal <cmd>
它将在后台运行并在退出时自动重新启动。
-
immortalctl
:查看正在运行的作业的状态。这里将打印一个name
列,您可以使用它来引用其他控制命令的作业。 -
immortalctl stop <name>
:停止使用给定名称监视作业(它不会自动重新启动,但当前进程将继续执行) -
immortalctl -k <name>
:将SIGKILL发送到当前进程。 -
immortalctl exit <name>
:停止使用给定名称监视作业,并将其从作业列表中删除。