如何监督并自动重启进程?


34

我想要一个进程,如果崩溃将重新启动。我搜索了一下,发现一个简单的解决方案是使用daemontools

我不明白如何配置它。

  1. 完成这种功能的最简单方法是什么?
  2. 如何配置呢?

Answers:


29

此答案适用于Upstart(<= 14.10)的Ubuntu版本。对Systemd(> = 15.04)的版本使用另一种方法。

似乎您正在寻找Ubuntu中已提供的Upstart功能respawn配置中的节将完全满足您的需求。我建议不要使用不太标准的方式来处理此问题。

如果没有有关您要尝试管理的流程的更多详细信息,那么很难说出配置的外观。例如,它取决于是否分叉并将其置于后台。respawn节上的Upstart文档应为您提供更多信息。

不幸的是,尚无法正确运行User Jobs:无法获得新手来运行User Job

假设我们要保持计算器应用程序运行,即使它被大火杀死(信号9)。

  1. 在中创建配置文件/etc/init/calculator.conf(基于本文):

    #!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
    
  2. 通过运行启动它

    sudo start calculator
    
  3. 它会在您当前的显示屏(: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计划,这将更加优雅。


当我尝试开始工作时我得到了未知的工作?任何想法。我已将文件放在/ etc / init中
opc0de 2013年

@ opc0de文件名servicename.conf必须与要启动的命令匹配start servicename。我怀疑您选择了其他名称。
gertvdijk

是的,它匹配,但是我没有遵循您的示例,所以我认为我可能有语法错误。
opc0de

@ opc0de好吧,首先请详细说明您要在问题中完成的工作:例如,哪种类型的应用程序/进程以及如何运行它,以及有关当前尝试的详细信息。
gertvdijk

解决了您的示例后,我的错误是我可能在exec策略中出错了。谢谢你的帮助!
opc0de 2013年

13

一个无需配置即可实现相同效果的极其简单的工具是immortalhttps : //immortal.run/

只需执行以下命令:

immortal <cmd>

它将在后台运行,如果退出将自动重启。

  • immortalctl:查看正在运行的作业的状态。name此处将打印一列,您可以使用此列和其他控制命令来引用作业。
  • immortalctl stop <name>:停止监视具有给定名称的作业(该作业不会自动重新启动,但是当前进程将继续执行)
  • immortalctl -k <name>:将SIGKILL发送到当前进程。
  • immortalctl exit <name>:停止监视具有给定名称的作业,并将其从作业列表中删除。

1
谢谢,这对于我在16.04中的用例非常有用。将其放入我的实用工具包中。
Quentin Skousen

2
确实,这看起来比新贵/重生更轻巧。
Sridhar Sarnobat

有没有得到它显示的方式stdout,并stderr在前台?
David S.

我不知道一个,因为它通常用于在后台运行进程。但是,您可以使用immortalctl -l out.log <cmd> && tail -f out.log来达到相同的效果。
extropic-engine

@DavidS。您可能会获得合并的日志,或者有stdout和stderr immortal.run/post/stderr
nbari

1

如果您不需要守护程序/服务/后台进程功能,而只想在控制台中执行此操作,则创建一个名为的文件autorestart.sh

#!/bin/bash

while [ 1 ]; do
  some_command
done

然后,如果退出或崩溃,./autorestart.sh它将自动重新启动some_command。CTRL-C中断循环并干净地退出程序。

在Ubuntu 18.04上测试。


0

有一种没有“暴发户”的方法。关键字是“ inittab” :-)。尽管该文件通常不会更改为默认文件,但可以将其用于在SYSV计算机上实现所需的重新生成。


我不明白为什么有人拒绝这个解决方案。如果您听不懂,只需在Google上搜索即可;在此处粘贴initttab的手册页毫无意义,您可以在系统上自行阅读!只需键入“ man inittab” ...
cepal67

13
高质量的答案比“使用它,自己弄清楚”更重要:)
赛斯2015年

0

ps-watcher是一种工具,用于监视正在运行的进程并在定义的情况下执行操作。让我们安装它:

apt-get install ps-watcher

有关详细信息,请参见运行HHVM并回退到PHP-FPM的底部-这对我来说效果很好。


由于时间不长,请添加代码摘要而不是文章,因为只有很短的一段适用于此问题。
derHugo

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.