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

fre*_*ker 18 monitoring systemd

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

目前为了暂时规避这个问题,我计划查看 journalctl 输出,如果它在指定的时间内没有改变,那么我将通过 shell 脚本终止该进程。

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

Jde*_*eBP 30

是的; 但在摆弄 systemd 之前先修复你的错误程序。

MariusMatutiae 是非常正确的。你的程序有问题。它陷入僵局。摆弄 systemd 不是答案。充其量,这是一种分心。修复您的程序,使其不被破坏。将您的精力集中在正确的事情上。

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

是的,systemd 可以监控守护进程并在它们停止说话时自动重启它们。不过,不仅仅是任何旧的守护进程。正如 mvp 所指出的,没有办法知道守护进程已经挂起(至少在这个宇宙中,停止问题是无法确定的)。无论是 systemd 还是任何其他计算机程序都无法从头开始推断抛出的某些随机程序已死锁,或进入无限循环,或其他任何情况。您将在这里得到的最好结果是检测到守护进程没有在所需的时间跨度内执行常规的“心跳”操作。

因此,利用 systemd 看门狗功能的守护进程必须编写为使用 systemd 特定协议,即 sd_notify 协议。这使守护程序代码稍微复杂化。这更复杂,因为如果编写正确,守护程序应该检查它们是否已在启用看门狗功能的情况下被调用。

使用 systemd 的看门狗功能的守护进程使用此协议……

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

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

进一步阅读

  • 伦纳特·波特林。2011-04-12。 看门狗。Freedesktop.org。

  • 当然,我必须解决这个问题,我唯一的目的是进行临时黑客攻击,直到我找出问题所在。感谢您的详细回答。 (2认同)