systemd 可以管理管道吗?

systemd 可以管理管道吗?

systemd 能否像 daemontools 系列一样管理管道?如果可以,那么实现此目的的最佳方法是什么?

我想要运行相当于service1 | service2service1都是service2(独立或不独立)由 systemd 管理的服务。

我希望能够service2在不中断 的情况下重新启动该过程service1。换句话说,退出service1时不能关闭正在写入的文件描述符。当 的新实例启动时,它应该继承现有的文件描述符,以便 的标准输出将流入新的。(就像 daemontools 在和之间维护一个管道一样,尽管管道不必是服务和记录器。)service2service2service1service2runlog/run

也许两者之间存在系统管理的 FIFO?

答案1

终于有机会自己解决这个问题了。我的解决方案需要支持fd以下选项StandardOutput=,该功能在 systemd 232 版(至少)中可用,但在 215 版中不可用。

有三个服务和两个 FIFO。它们共同构成了管道input | filter | output,管道的任何部分都可以单独重启,且不会丢失数据。

input过程将数据写入 FIFO filter,然后从 FIFO 中读取数据,再将数据写入 FIFO,然后从 FIFO 中output读取数据。

输入服务

[Unit]
Description=The input process
Requires=filter.socket
After=filter.socket

Wants=filter.service output.service

[Service]
TimeoutStartSec=infinity

Sockets=filter.socket

StandardInput=null
StandardOutput=fd:filter.socket
StandardError=journal
ExecStart=/path/to/input

Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

过滤器服务

[Unit]
Description=The filter process
Requires=filter.socket output.socket
After=filter.socket output.socket

[Service]
TimeoutStartSec=infinity

Sockets=filter.socket
Sockets=output.socket

StandardInput=fd:filter.socket
StandardOutput=fd:output.socket
StandardError=journal
ExecStart=/path/to/filter

Restart=always
RestartSec=5s

过滤器.socket

[Unit]
Description=Filter process reads from this

[Socket]
ListenFIFO=/run/filter
SocketMode=0600
RemoveOnStop=false

输出.服务

[Unit]
Description=The output process
Requires=output.socket
After=output.socket

[Service]
TimeoutStartSec=infinity

Sockets=output.socket

StandardInput=fd:output.socket
StandardOutput=journal
StandardError=journal
ExecStart=output

Restart=always
RestartSec=5s

输出.插座

[Unit]
Description=Output process reads from this

[Socket]
ListenFIFO=/run/output
SocketMode=0600
RemoveOnStop=false

答案2

让服务写入标准输出,并在 systemd 单元文件中配置 StandardOutput,以便服务写入日志:

http://0pointer.de/public/systemd-man/systemd.exec.html

这使得日志可供 journald 服务使用,该服务为日志使用提供了其他选项。

http://0pointer.de/public/systemd-man/journald.conf.html

自定义“记录器”可以是 journald 客户端,可以直接从日志中提取数据,如果不可用,上游服务当然不会受到影响。记录器还可以配置自己的单元文件,以便由 systemd 进行管理。

相关内容