使用 Supervisor 时,有几个插件可用,如果应用程序占用过多内存(例如某些 Java 工具出现内存泄漏)或应用程序没有响应(即使它没有正式崩溃),它们可以重新启动应用程序。我也在寻找一种在 SystemD 级别执行此操作的好方法。有没有人可以给 SystemD 一个命令来识别已启动的应用程序是否仍在运行?可能类似于 ExecStartPost 选项。
答案1
您可以使用看门狗来监控服务:
WatchdogSec=
配置服务的看门狗超时。看门狗在启动完成时激活。服务必须定期使用“WATCHDOG=1”(即“keep-alive ping”)调用 sd_notify(3)。如果两次调用之间的时间大于配置的时间,则服务将处于失败状态,并将使用 SIGABRT(或 WatchdogSignal= 指定的信号)终止。通过将 Restart= 设置为 on-failure、on-watchdog、on-abnormal 或 always,服务将自动重新启动。此处配置的时间将传递给 WATCHDOG_USEC= 环境变量中执行的服务进程。如果为服务启用了看门狗支持,这允许守护进程自动启用 keep-alive ping 逻辑。如果使用此选项,应将 NotifyAccess=(见下文)设置为打开对 systemd 提供的通知套接字的访问。如果未设置 NotifyAccess=,则将隐式设置为 main。默认为 0,表示禁用此功能。服务可以检查服务管理器是否需要看门狗保持活动通知。有关详细信息,请参阅 sd_watchdog_enabled(3)。sd_event_set_watchdog(3) 可用于启用自动看门狗通知支持。
你可以在网上找到很多例子。