在研究使用文件锁定的解决方案时,我相信我的代码陷入了僵局。我正在使用systemd在系统启动时启动该过程。使用alarm(3)是一个选项,但是我想知道systemd是否有办法检测挂起的进程并重新启动它们?
目前,为了暂时解决此问题,我打算查看journalctl输出,如果在指定的时间内没有变化,那么我将通过Shell脚本终止该过程。
只是想知道是否有更好的方法可以通过systemd或其他方式监视进程。
在研究使用文件锁定的解决方案时,我相信我的代码陷入了僵局。我正在使用systemd在系统启动时启动该过程。使用alarm(3)是一个选项,但是我想知道systemd是否有办法检测挂起的进程并重新启动它们?
目前,为了暂时解决此问题,我打算查看journalctl输出,如果在指定的时间内没有变化,那么我将通过Shell脚本终止该过程。
只是想知道是否有更好的方法可以通过systemd或其他方式监视进程。
Answers:
MariusMatutiae是非常正确的。您的程序有问题。陷入僵局。摆弄systemd并不是答案。充其量,这会让人分心。修复程序,使其不会损坏。将精力放在正确的事情上。
也就是说,其他人会因为问题标题而不是适当的问题而来这里。为了他们的利益,这是标题的答案,而忽略了适当的问题:
是的,systemd可以监视守护进程并在它们停止讲话时自动重新启动它们。不过,不仅是任何老妖怪。正如mvp所指出的,没有办法知道恶魔已经挂了(在这个宇宙中,停顿问题至少是无法确定的)。无论是systemd还是任何其他计算机程序,都无法从头开始推断抛出给他们的随机程序已经死锁,陷入无限循环等等。您将获得的最好结果是检测到守护进程未在所需的时间范围内执行常规的“心跳”操作。
因此,必须编写利用systemd的看门狗功能的Dæmons,以说出特定于systemd的协议sd_notify协议。这会使dæmon代码变得有些复杂。由于dæmons如果正确编写,还应该检查它们是否已在启用了watchdog功能的情况下被调用,因此更加复杂。
讲这个协议的恶魔利用systemd的看门狗功能……
WATCHDOG_USEC
环境变量;WATCHDOG=1
选项,间隔约为WATCHDOG_USEC
/ 2(“ USEC”代表微秒);Type=notify
在其单位文件中设置;NotifyAccess=main
(或=all
);WatchdogSec=
秒数。libsystemd-daemon.so
如果您想了解编码的详细信息,请在阅读手册后,确保使用正确的StackExchange。这是超级用户。StackOverflow 在那儿。
for(;;) do_something();
怎么办?