Systemd

systemd 可以管理管道嗎?

  • October 15, 2019

systemd 可以管理類似於 daemontools 家族的管道嗎?如果是這樣,實現這一目標的最佳方法是什麼?

我想執行與systemd 管理的service1 | service2whereservice1和are(單獨或不)服務的等效項。service2

我希望能夠在service2不中斷的情況下重新啟動該過程service1。換句話說,正在寫入的文件描述符在退出service1時一定不能關閉。service2當一個新的實例service2啟動時,它應該繼承現有的文件描述符,以便 stdout fromservice1將流入新的service2. (很像 daemontools 在runand之間維護一個管道log/run,儘管管道不必是服務和記錄器。)

也許在兩者之間有一個由 systemd 管理的 FIFO?

終於有機會並且需要自己解決這個問題。我的解決方案需要支持fdto 選項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

引用自:https://serverfault.com/questions/791395