systemd 能否像 daemontools 系列一样管理管道?如果可以,那么实现此目的的最佳方法是什么?
我想要运行相当于service1 | service2
和service1
都是service2
(独立或不独立)由 systemd 管理的服务。
我希望能够service2
在不中断 的情况下重新启动该过程service1
。换句话说,退出service1
时不能关闭正在写入的文件描述符。当 的新实例启动时,它应该继承现有的文件描述符,以便 的标准输出将流入新的。(就像 daemontools 在和之间维护一个管道一样,尽管管道不必是服务和记录器。)service2
service2
service1
service2
run
log/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 进行管理。