该问题与以下内容相关:为 autossh 提供可靠的 systemd 服务
我有一个使用 type=simple 的服务。以下是 systemd 文档:
Type=simple(默认):systemd 认为该服务会立即启动。进程不得分叉。如果需要在此服务上调用其他服务,请不要使用此类型,除非它是套接字激活的。
想象一下服务陷入无限循环或挂起。
systemd 如何知道服务是否正常?
有没有某种如果工业控制计算机systemd 和服务之间可以实现吗?
我想要的是:我需要systemctl status foo-service
知道服务是否正常。这与“服务的 Linux 进程是否仍然存在”不同。
答案1
systemctl status
不提供有关服务运行的高级信息。
如果你正在寻找方法来通知 systemd 有关你的服务状态的变化,sd_notify
可能会有所帮助。不过,这取决于您的服务自我诊断的能力。如果您的服务使用sd_notify, you can configure the service with
WatchdogSec。引用自文档:
配置服务的看门狗超时。启动完成后,看门狗将被激活。服务必须定期使用“WATCHDOG=1”(即“keep-alive ping”)调用 sd_notify(3)。如果两次调用之间的时间大于配置的时间,则服务将处于失败状态,并将使用 SIGABRT 终止。
但是,使用systemctl show
您可以检索有关该服务的一些额外的机器可读信息,这可能有助于您判断该服务是否正常。
如果你想systemd
知道你的服务是否无限循环运行,你很可能运气不佳。这个问题与停机问题,已证明不存在解决该问题的通用算法。虽然您的特定问题可能可以解决,但这很可能至少会浪费大量资源。请参阅这个相关问题。