如何在服务停止时关闭 systemd 套接字?

Ren*_*ene 7 systemd services socket fifo socket-activation

我目前正在尝试使用两个 Fifo 套接字创建一个 systemd 服务。这些套接字映射到应用程序的标准输出和标准输入。我当前正在使用以下配置文件。

foo.service

[Unit]
Description=foo Fifo test
After=network.target foo-in.socket foo-out.socket
Requires=foo-in.socket foo-out.socket

[Service]
Sockets=foo-out.socket
Sockets=foo-in.socket
StandardOutput=fd:foo-out.socket
StandardInput=fd:foo-in.socket
StandardError=journal
ExecStart=/path/to/foo/exec
Run Code Online (Sandbox Code Playgroud)

foo-out.socket

[Unit]
Description=foo Task Writes to this

[Socket]
Service=foo.service
ListenFIFO=%t/foo/out
Run Code Online (Sandbox Code Playgroud)

foo-in.socket

[Unit]
Description=foo Task reads commands from this

[Socket]
Service=foo.service
ListenFIFO=/run/user/1000/foo/in
Run Code Online (Sandbox Code Playgroud)

systemctl --user daemon-reload我可以使用命令和启动服务systemctl --user start foo。当我尝试停止 foo.service 时,问题就出现了。我收到这条消息:

Warning: Stopping foo.service, but it can still be activated by:
  foo-in.socket
  foo-out.socket
Run Code Online (Sandbox Code Playgroud)

有没有办法在服务停止时自动停止套接字?

Jor*_*ton 2

ExecStopPost 方法

\n

您可以使用[Service]块的ExecStopPost=当服务在成功完成后或由于失败而停止时,

\n

例子

\n

仅更新了最后一行。

\n
[Unit]\nDescription=foo Fifo test\nAfter=network.target foo-in.socket foo-out.socket\nRequires=foo-in.socket foo-out.socket\n\n[Service]\nSockets=foo-out.socket\nSockets=foo-in.socket\nStandardOutput=fd:foo-out.socket\nStandardInput=fd:foo-in.socket\nStandardError=journal\nExecStart=/path/to/foo/exec\nExecStopPost=systemctl --user stop foo-out.socket ; systemctl --user stop foo-in.socket\n
Run Code Online (Sandbox Code Playgroud)\n

来源:systemd.service(重点是我的)

\n
\n

服务停止后执行的附加命令。这包括使用 ExecStop= 中配置的命令、服务未定义任何 ExecStop= 或服务意外退出的情况。此参数采用多个命令行,遵循与 ExecStart= 描述的相同方案。这些设置的使用是可选的。支持说明符和环境变量替换。请注意,与 ExecStop= \xe2\x80\x93 不同,当服务无法正确启动并再次关闭时,将调用使用此设置指定的 \xe2\x80\x93 命令。

\n

建议使用此设置进行清理操作,即使服务无法正确启动也应执行这些操作。即使服务中途启动失败并留下未完全初始化的数据,使用此设置配置的命令也需要能够运行。由于执行此设置指定的命令时服务进程已终止,因此它们不应尝试与它们通信。

\n

请注意,使用此设置配置的所有命令都将使用服务的结果代码以及主进程的退出代码和状态进行调用,这些代码和状态在 $SERVICE_RESULT、$EXIT_CODE 和 $EXIT_STATUS 环境变量中设置,请参阅 systemd。 exec(5) 了解详细信息。

\n

请注意,出于 Before=/After= 排序约束的目的,考虑了 ExecStopPost= 的执行。

\n
\n