Systemd
systemd 可以管理管道嗎?
systemd 可以管理類似於 daemontools 家族的管道嗎?如果是這樣,實現這一目標的最佳方法是什麼?
我想執行與systemd 管理的
service1 | service2
whereservice1
和are(單獨或不)服務的等效項。service2
我希望能夠在
service2
不中斷的情況下重新啟動該過程service1
。換句話說,正在寫入的文件描述符在退出service1
時一定不能關閉。service2
當一個新的實例service2
啟動時,它應該繼承現有的文件描述符,以便 stdout fromservice1
將流入新的service2
. (很像 daemontools 在run
and之間維護一個管道log/run
,儘管管道不必是服務和記錄器。)也許在兩者之間有一個由 systemd 管理的 FIFO?
終於有機會並且需要自己解決這個問題。我的解決方案需要支持
fd
to 選項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
過濾器服務
[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
輸出.socket
[Unit] Description=Output process reads from this [Socket] ListenFIFO=/run/output SocketMode=0600 RemoveOnStop=false