我有几个 systemd 用户服务,但过了一段时间它们都停止了(并重新启动),几乎没有任何信息。以下是其中一个服务,一个 Go Web 服务器:
[Unit]
Description=App
[Service]
WorkingDirectory=/home/dev/app
ExecStart=sh /home/dev/app/run.sh
Restart=always
[Install]
WantedBy=default.target
已启用systemctl --user enable app
。
查看 journalctl 我发现:
Jan 26 16:53:41 Ubuntu-2004-focal-amd64-base systemd[411708]: Started App.
Jan 26 17:03:44 Ubuntu-2004-focal-amd64-base systemd[411708]: Stopping App...
Jan 26 17:03:44 Ubuntu-2004-focal-amd64-base systemd[411708]: app: Killing process 411808 (renderer) with signal SIGKILL.
Jan 26 17:03:44 Ubuntu-2004-focal-amd64-base systemd[411708]: app.service: Succeeded.
Jan 26 17:03:44 Ubuntu-2004-focal-amd64-base systemd[411708]: Stopped App.
Jan 26 17:03:54 Ubuntu-2004-focal-amd64-base systemd[412783]: Started App.
我错过了什么?
谢谢
答案1
该行为解释为logind.conf(5):
用户停止延迟安全码¶
指定保留用户记录和每个用户服务的时间[电子邮件保护]用户完全退出后,每个用户的服务将持续运行。如果设置为零,则当用户的最后一个会话结束时,每个用户的服务将立即终止。如果将此选项配置为非零,则快速注销/登录周期将加快,因为用户的服务管理器不会不断重新启动。如果设置为“无限”,则用户的每个用户服务在首次登录后永远不会再次终止,并继续运行直到系统关闭。默认为 10 秒。
虽然没有明确提到,但启用 linger 会导致与上述“无限”类似的效果(对于特定用户)。此外,启用 linger 后,“[电子邮件保护]“将在启动时自动启动,即使之后没有尝试登录。(我不知道后者是否有记录在案,我当然希望开发人员永远不会改变这种行为。)
以下设置是另一个可能相关的设置。(我认为这里的进程包括作为用户服务运行的进程。)
KillUserProcesses=¶
采用布尔参数。配置用户注销时是否应终止用户的进程。如果为 true,则会话对应的范围单元及其范围内的所有进程都将被终止。如果为 false,则范围将被“放弃”,请参阅 systemd.scope(5),并且不会终止进程。默认为“是”,但请参阅下面的 KillOnlyUsers= 和 KillExcludeUsers= 选项。
除了会话进程之外,用户进程还可以在用户管理器单元下运行[电子邮件保护]。根据 linger 设置,这可能允许用户独立于其登录会话运行进程。请参阅 loginctl(1) 中 enable-linger 的描述。
请注意,登录是指实际产生会话的登录。/据我所知,它不算数sudo -i
。su -
此外,指定的系统服务User=
与用户服务不同。