我在 下运行一个守护进程systemd
(它处于静止状态并监视大量 RSS 源并发送有关它们的通知)。它是一个 (Scala) JVM 进程,本质上是一个无限循环。
进程启动得很顺利,但最后却神秘地自行退出了Deactivated successfully
。在systemctl status
输出中,它声称已成功退出,退出代码为 0。
但不应该成功退出。这是一个无限循环!我已经在主函数末尾添加了日志记录SEVERE
,如果本应是无限循环的行以某种方式终止,或者Throwable
发生任何情况,则记录概念。
未记录任何内容。信号终止会显示在日志中,并且不会是成功退出。我有Restart=on-failure
。(我想我可以使用 来解决这个问题,Restart=always
但我想了解为什么会发生这种情况。)
我不明白从systemd
的角度来看该过程如何成功退出,但从我的角度来看它永远无法成功退出。
我的配置有一个不寻常的方面,就是我在systemd
asType=forking
而不是下运行守护进程Type=simple
。我让它的构建工具(奇妙的mill
) 重建然后分叉,这样我就可以编辑一些模板和配置文件,这些文件通过代码生成编译到守护进程中。所有这些似乎都有效:成功重建并启动每个或mill
上的进程,守护进程成功分叉,并运行一段时间——查看最新事件,几乎正好 50 分钟——然后才出现任何神秘的停用。子进程(而不是分叉父进程)发出文件,因此会抱怨systemct start
restart
PID
systemd
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
期望。
有了这个,我的启动时重建守护进程就可以预测且可靠地运行。