web-dev-qa-db-ja.com

systemdはパイプラインを管理できますか?

Systemdはdaemontoolsファミリーと同じようにパイプラインを管理できますか?もしそうなら、これを達成するための最良の方法は何ですか?

service1 | service2と同等のものを実行したいと思います。ここでservice1service2は両方ともsystemdによって管理される(別個の)サービスです。

service2を中断せずにservice1プロセスを再開できるようにしたいと思います。つまり、service1が終了するときに、service2が書き込んでいるファイル記述子を閉じてはなりません。 service2の新しいインスタンスが開始すると、既存のファイル記述子を継承して、service1からのstdoutが新しいservice2に流れ込むようにする必要があります。 (daemontoolsがrunlog/runの間のパイプを維持するのと同じように、パイプラインはサービスとロガーである必要はありません。)

おそらく、systemdが管理するFIFOの間に何かありますか?

1
Patrick

ついに機会があり、これを自分で解決する必要がありました。私のソリューションでは、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
4
Patrick

サービスにstdoutへの書き込みを依頼し、systemdユニットファイルでStandardOutputを構成して、サービスがジャーナルに書き込むようにします。

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

これにより、ログを消費するための他のオプションを提供するジャーナルサービスでログを利用できるようになります。

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

カスタム「ロガー」はジャーナル化されたクライアントにすることができ、ジャーナルから直接プルすることができます。利用できない場合でも、アップストリームサービスはもちろん影響を受けません。ロガーは、systemdによって管理されるように、独自のユニットファイルで構成することもできます。

1
Jonah Benton