Pat*_*ick 1 daemontools systemd
systemd 可以管理类似于 daemontools 系列的管道吗?如果是这样,实现这一目标的最佳方法是什么?
我想运行与systemd 管理的service1 | service2whereservice1和service2are(单独或不单独)服务的等价物。
我希望能够在service2不中断的情况下重新启动该过程service1。换句话说,退出service1时不能关闭正在写入的文件描述符service2。当 的新实例service2启动时,它应该继承现有的文件描述符,以便 stdout fromservice1将流入新的service2. (就像 daemontools 在run和之间维护一个管道log/run,尽管管道不必是服务和记录器。)
也许中间有 systemd 管理的 FIFO?
终于有机会并且需要自己解决这个问题。我的解决方案需要支持fd选项StandardOutput=,该选项在(至少)systemd 232 版中可用,但在 215 版中不可用。
共有三个服务和两个 FIFO。它们一起创建了管道input | filter | output,管道的任何部分都可以单独重新启动而不会丢失数据。
该input进程写入filter读取的 FIFO,然后写入output读取的 FIFO 。
输入.服务
[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
Run Code Online (Sandbox Code Playgroud)
过滤器服务
[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
Run Code Online (Sandbox Code Playgroud)
过滤器套接字
[Unit]
Description=Filter process reads from this
[Socket]
ListenFIFO=/run/filter
SocketMode=0600
RemoveOnStop=false
Run Code Online (Sandbox Code Playgroud)
输出.服务
[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
Run Code Online (Sandbox Code Playgroud)
输出接口
[Unit]
Description=Output process reads from this
[Socket]
ListenFIFO=/run/output
SocketMode=0600
RemoveOnStop=false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3318 次 |
| 最近记录: |