systemd可以检测并杀死挂起的进程吗?


16

在研究使用文件锁定的解决方案时,我相信我的代码陷入了僵局。我正在使用systemd在系统启动时启动该过程。使用alarm(3)是一个选项,但是我想知道systemd是否有办法检测挂起的进程并重新启动它们?

目前,为了暂时解决此问题,我打算查看journalctl输出,如果在指定的时间内没有变化,那么我将通过Shell脚本终止该过程。

只是想知道是否有更好的方法可以通过systemd或其他方式监视进程。


可能不会。您如何判断进程是否挂起?如果您真的需要类似的东西for(;;) do_something();怎么办?
mvp

4
严格来说,如果您的代码挂起,则应调试该问题。通过systemd杀死它(假设它可以完成,我不相信)或以其他任何方式杀死它是调试它的正确方法。但是您只是无法让它陷入僵局。
MariusMatutiae

Answers:


25

是; 但请先修复您的越野车程序,然后再使用systemd。

MariusMatutiae是非常正确的。您的程序有问题。陷入僵局。摆弄systemd并不是答案。充其量,这会让人分心。修复程序,使其不会损坏。将精力放在正确的事情上。

也就是说,其他人会因为问题标题而不是适当的问题而来这里。为了他们的利益,这是标题的答案,而忽略了适当的问题:

是的,systemd可以监视守护进程并在它们停止讲话时自动重新启动它们。不过,不仅是任何老妖怪。正如mvp所指出的,没有办法知道恶魔已经挂了(在这个宇宙中,停顿问题至少是无法确定的)。无论是systemd还是任何其他计算机程序,都无法从头开始推断抛出给他们的随机程序已经死锁,陷入无限循环等等。您将获得的最好结果是检测到守护进程未在所需的时间范围内执行常规的“心跳”操作。

因此,必须编写利用systemd的看门狗功能的Dæmons,以说出特定于systemd的协议sd_notify协议。这会使dæmon代码变得有些复杂。由于dæmons如果正确编写,还应该检查它们是否已在启用了watchdog功能的情况下被调用,因此更加复杂。

讲这个协议的恶魔利用systemd的看门狗功能……

  • ……必须检查WATCHDOG_USEC环境变量;
  • …必须在整个生命周期中连续不断地调用sd_notify(),并设置WATCHDOG=1选项,间隔约为WATCHDOG_USEC/ 2(“ USEC”代表微秒);
  • …必须Type=notify在其单位文件中设置;
  • ……应在其单位文件中设置NotifyAccess=main(或=all);
  • …必须在其单位文件中设置WatchdogSec=秒数
  • …必须与 libsystemd-daemon.so

如果您想了解编码的详细信息,请在阅读手册后,确保使用正确的StackExchange。这是超级用户。StackOverflow 在那儿

进一步阅读

  • Lennart Poettering。2011-04-12。 看门狗。Freedesktop.org。

2
当然,我必须解决此问题,我的唯一目的是临时找出问题,直到找出问题为止。感谢您的详细回答。
freethinker 2013年
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.