Systemdはdaemontoolsファミリーと同じようにパイプラインを管理できますか?もしそうなら、これを達成するための最良の方法は何ですか?
service1 | service2
と同等のものを実行したいと思います。ここでservice1
とservice2
は両方ともsystemdによって管理される(別個の)サービスです。
service2
を中断せずにservice1
プロセスを再開できるようにしたいと思います。つまり、service1
が終了するときに、service2
が書き込んでいるファイル記述子を閉じてはなりません。 service2
の新しいインスタンスが開始すると、既存のファイル記述子を継承して、service1
からのstdoutが新しいservice2
に流れ込むようにする必要があります。 (daemontoolsがrun
とlog/run
の間のパイプを維持するのと同じように、パイプラインはサービスとロガーである必要はありません。)
おそらく、systemdが管理するFIFOの間に何かありますか?
ついに機会があり、これを自分で解決する必要がありました。私のソリューションでは、fd
オプションをサポートする必要があります StandardOutput=
、これは(少なくとも)systemdバージョン232で使用できますが、バージョン215では使用できません。
3つのサービスと2つのFIFOがあります。一緒にパイプラインを作成しますinput | filter | output
、およびパイプラインの任意の部分は、データを失うことなく個別に再起動できます。
input
プロセスはa FIFOに書き込み、そこからfilter
が読み取り、次にa FIFO that output
読み取り。
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
サービスにstdoutへの書き込みを依頼し、systemdユニットファイルでStandardOutputを構成して、サービスがジャーナルに書き込むようにします。
http://0pointer.de/public/systemd-man/systemd.exec.html
これにより、ログを消費するための他のオプションを提供するジャーナルサービスでログを利用できるようになります。
http://0pointer.de/public/systemd-man/journald.conf.html
カスタム「ロガー」はジャーナル化されたクライアントにすることができ、ジャーナルから直接プルすることができます。利用できない場合でも、アップストリームサービスはもちろん影響を受けません。ロガーは、systemdによって管理されるように、独自のユニットファイルで構成することもできます。