永不终止的 systemd 守护进程“成功”停用

永不终止的 systemd 守护进程“成功”停用

我在 下运行一个守护进程systemd(它处于静止状态并监视大量 RSS 源并发送有关它们的通知)。它是一个 (Scala) JVM 进程,本质上是一个无限循环。

进程启动得很顺利,但最后却神秘地自行退出了Deactivated successfully。在systemctl status输出中,它声称已成功退出,退出代码为 0。

但不应该成功退出。这是一个无限循环!我已经在主函数末尾添加了日志记录SEVERE,如果本应是无限循环的行以某种方式终止,或者Throwable发生任何情况,则记录概念。

未记录任何内容。信号终止会显示在日志中,并且不会是成功退出。我有Restart=on-failure。(我想我可以使用 来解决这个问题,Restart=always但我想了解为什么会发生这种情况。)

我不明白从systemd的角度来看该过程如何成功退出,但从我的角度来看它永远无法成功退出。

我的配置有一个不寻常的方面,就是我在systemdasType=forking而不是下运行守护进程Type=simple。我让它的构建工具(奇妙的mill) 重建然后分叉,这样我就可以编辑一些模板和配置文件,这些文件通过代码生成编译到守护进程中。所有这些似乎都有效:成功重建并启动每个或mill上的进程,守护进程成功分叉,并运行一段时间——查看最新事件,几乎正好 50 分钟——然后才出现任何神秘的停用。子进程(而不是分叉父进程)发出文件,因此会抱怨systemct startrestartPIDsystemd

feedletter.service: Can't open PID file /home/feedletter/feedletter-local/feedletter.pid (yet?) after start: No such file or directory

但我估计很快就能找到该文件,因为它没有超时。

这是最新的systemctl status输出:

# systemctl status feedletter 
○ feedletter.service - Feedletter RSS-To-Mail-Etc Service
     Loaded: loaded (/etc/systemd/system/feedletter.service; enabled; preset: enabled)
     Active: inactive (dead) since Fri 2024-01-26 09:07:20 UTC; 10h ago
   Duration: 49min 57.712s
   Main PID: 10994 (code=exited, status=0/SUCCESS)
        CPU: 55.934s

Jan 26 08:51:38 feedletter-play feedletter[10994]: 2024-01-26@08:51:38 [INFO] [com.mchange.feedletter.db.PgDatabase] Subscription with ID 2 has been marked confirmed.
Jan 26 08:51:45 feedletter-play feedletter[10994]: 2024-01-26@08:51:45 [INFO] [com.mchange.feedletter.db.PgDatabase] Subscription with ID 3 has been marked confirmed.
Jan 26 08:59:23 feedletter-play feedletter[10994]: 2024-01-26@08:59:23 [FINE] [com.mchange.feedletter.db.PgDatabase] Deleting any as-yet-unassigned items that have been deleted from feed with ID 1
Jan 26 08:59:23 feedletter-play feedletter[10994]: 2024-01-26@08:59:23 [INFO] [com.mchange.feedletter.db.PgDatabase] Updated/assigned all items from feed with ID 1, feed URL 'https://lawyersgunsdev.wpengine.com/feed'
Jan 26 08:59:33 feedletter-play feedletter[10994]: 2024-01-26@08:59:33 [FINE] [com.mchange.feedletter.db.PgDatabase] Updated last-checked-time on a stable already-assigned, not yet cleared, item, feed ID 2, guid 'tag:blogger.com,1999:blog-3456975.post-7737119998523372540'.
Jan 26 08:59:33 feedletter-play feedletter[10994]: 2024-01-26@08:59:33 [FINE] [com.mchange.feedletter.db.PgDatabase] Updated last-checked-time on a stable already-assigned, not yet cleared, item, feed ID 2, guid 'tag:blogger.com,1999:blog-3456975.post-7431934517490670965'.
Jan 26 08:59:33 feedletter-play feedletter[10994]: 2024-01-26@08:59:33 [FINE] [com.mchange.feedletter.db.PgDatabase] Deleting any as-yet-unassigned items that have been deleted from feed with ID 2
Jan 26 08:59:33 feedletter-play feedletter[10994]: 2024-01-26@08:59:33 [INFO] [com.mchange.feedletter.db.PgDatabase] Updated/assigned all items from feed with ID 2, feed URL 'https://www.eschatonblog.com/feeds/posts/default?alt=rss'
Jan 26 09:07:20 feedletter-play systemd[1]: feedletter.service: Deactivated successfully.
Jan 26 09:07:20 feedletter-play systemd[1]: feedletter.service: Consumed 55.934s CPU time.

这是单元文件:

[Unit]
Description=Feedletter RSS-To-Mail-Etc Service
After=syslog.target network.target

[Service]
Type=forking
PIDFile=/home/feedletter/feedletter-local/feedletter.pid
User=feedletter
Group=feedletter
WorkingDirectory=/home/feedletter/feedletter-local

ExecStart=/home/feedletter/feedletter-local/feedletter daemon --fork

TimeoutStopSec=90
Restart=on-failure
RestartSec=10s
StandardError=journal
StandardOutput=journal
StandardInput=null

[Install]
WantedBy=multi-user.target

操作系统是 Ubuntu 23.10。

如有任何帮助或见解,我们将不胜感激!

答案1

该问题出在我如何使用守护进程分叉时mill

该构建工具的runBackground任务确实可以很容易地为您分叉进程,但它们用收割机包裹它们监视进程源中的变化,并在发生变化时自动“成功”终止分叉进程,退出代码为 0。

我的无限循环总是无限循环。只是有另一个线程在监视一些文件,并在发生意外重大事件时关闭包含循环的进程。

为了克服这个问题,我写了扩展mill定义runDaemon任务,重现不错的分叉runBackground任务,而无需运行这个偷偷摸摸的自杀线程。扩展还可以在终止之前发出 PID 文件,完全遵守分叉协议的systemd期望。

有了这个,我的启动时重建守护进程就可以预测且可靠地运行。

相关内容