systemd可以pipe理一个pipe道吗?

systemd可以pipe理一个类似于daemontools家族的stream水线吗? 如果是这样,那么实现这个目标的最好方法是什么?

我想运行相当于service1 | service2 service1 | service2 ,其中service1service2是由systemdpipe理的(独立的或不是)服务。

我希望能够在不中断service1情况下重新启动service2进程。 换句话说,当service2退出时, service1写入的service1不能closures。 当一个新的service2实例启动时,它应该inheritance现有的文件描述符,以便来自service1 stdout将stream入新的service2 。 (就像daemontools在runlog/run之间维护一个pipe道一样,虽然pipe道不需要是服务和logging器。)

也许有一个系统pipe理的FIFO之间的东西?

最后有机会和需要通过自己的工作。 我的解决scheme需要对StandardOutput= fd选项的支持,该选项在(至less)systemd版本232中可用,但在版本215中不可用。

有三个服务和两个FIFO。 他们一起创buildpipe道input | filter | output input | filter | output input | filter | output ,并且pipe道的任何部分都可以单独重新启动而不会丢失数据。

input过程写入一个从中读取的filter ,然后写入一个output读取的FIFO。

input.service

 [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 

filter.service

 [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 

filter.socket

 [Unit] Description=Filter process reads from this [Socket] ListenFIFO=/run/filter SocketMode=0600 RemoveOnStop=false 

output.service

 [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 

output.socket

 [Unit] Description=Output process reads from this [Socket] ListenFIFO=/run/output SocketMode=0600 RemoveOnStop=false 

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

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

这使得日志服务可以使用日志,该日志服务还提供其他日志消耗选项。

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

一个自定义的“logging器”可以是一个已logging的客户端,可以直接从日志中提取,如果不可用,上游服务当然不会受到影响。 logging器也可以用自己的单元文件进行configuration,以便由systemdpipe理。