現在、2つのFifoソケットを使用してシステムサービスを作成しようとしています。これらのソケットはアプリケーションの標準出力と標準入力にマッピングされます。現在、次の設定ファイルを使用しています。
foo.service
[Unit]
Description=foo Fifo test
After=network.target foo-in.socket foo-out.socket
Requires=foo-in.socket foo-out.socket
[Service]
Sockets=foo-out.socket
Sockets=foo-in.socket
StandardOutput=fd:foo-out.socket
StandardInput=fd:foo-in.socket
StandardError=journal
ExecStart=/path/to/foo/exec
foo-out.socket
[Unit]
Description=foo Task Writes to this
[Socket]
Service=foo.service
ListenFIFO=%t/foo/out
foo-in.socket
[Unit]
Description=foo Task reads commands from this
[Socket]
Service=foo.service
ListenFIFO=/run/user/1000/foo/in
systemctl --user daemon-reload
コマンドを使用してサービスを開始できますsystemctl --user start foo
。 foo.serviceを停止しようとすると問題が発生します。次のメッセージが表示されます。
Warning: Stopping foo.service, but it can still be activated by:
foo-in.socket
foo-out.socket
サービスが停止したらソケットを自動的に停止する方法はありますか?
答え1
手動でドラッグできる良い例です。ここの例は、「docker」サービスを終了しようとすることです。
root@localhost:~# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
docker.socket
root@llocalhost:~# systemctl stop docker.socket
root@logicaldoc:~# ps aux | grep docker
root 1519 0.0 0.0 14220 924 pts/0 S+ 17:41 0:00 grep --color=auto docker
答え2
ExecStopPostメソッド
このブロックのオプションを使用すると、サービスが正常に完了した後、または失敗によって停止したときに[Service]
任意のコマンドを実行できます。ExecStopPost=
はい
最後の行のみが更新されます。
[Unit]
Description=foo Fifo test
After=network.target foo-in.socket foo-out.socket
Requires=foo-in.socket foo-out.socket
[Service]
Sockets=foo-out.socket
Sockets=foo-in.socket
StandardOutput=fd:foo-out.socket
StandardInput=fd:foo-in.socket
StandardError=journal
ExecStart=/path/to/foo/exec
ExecStopPost=systemctl --user stop foo-out.socket ; systemctl --user stop foo-in.socket
源泉:システムサービス(強調は私のもの)
サービスが停止した後に実行する追加のコマンド。これには、ExecStop =に設定されたコマンドが使用されているか、サービスにExecStop =が定義されていないか、サービスが予期せず終了する状況が含まれます。このパラメータは、ExecStart =について説明したのと同じスキームに従う複数のコマンドラインを使用します。これらの設定の使用はオプションです。指定子と環境変数の置換をサポートします。ExecStop =とは異なり、この設定で指定されたコマンドは、サービスが正しく開始されず、再び終了したときに呼び出されます。
この設定は、サービスが正しく開始されない場合でも実行する必要があるクリーンアップ操作にお勧めします。この設定で構成されたコマンドは、サービスが途中で開始されず、不完全に初期化されたデータが残っている場合でも実行できるはずです。この設定で指定されたコマンドが実行されると、サービスのプロセスはすでに終了しているため、そのプロセスと通信しようとしないでください。
この設定で構成されたすべてのコマンドは、$ SERVICE_RESULT、$ EXIT_CODE、および$ EXIT_STATUS環境変数に設定されているサービスの結果コード、および基本プロセスの終了コードと状態で呼び出されます。 exec(5) 詳細を参照してください。 。
Before=/After= 順序制約の場合、ExecStopPost= 実行が考慮されます。
答え3
viaで始まるExecStopPost=/rm (socket pathname)
定義に追加されました。/etc/systemctl/system/(???).socket
(???).service
"Requires=???.socket"
ソケットを削除するには、サービスを停止してからソケットも停止します。ソケットを停止しないと、ソケットに書き込むすべてのクライアントがサービスを停止したときに表示されるメッセージに従ってサービスを再度有効にします。
警告: (???).service を停止していますが、次の機能で引き続き有効にできます: (???).socket
答え4
追加しませんが、ExecStopPost=systemctl ...
systemdの事前定義された関係に依存しますPartOf=
。
~からマニュアルページ:
PartOf=
Configures dependencies similar to Requires=, but limited to stopping and
restarting of units. When systemd stops or restarts the units listed
here, the action is propagated to this unit. Note that this is a one-way
dependency — changes to this unit do not affect the listed units.
When PartOf=b.service is used on a.service, this dependency will show as
ConsistsOf=a.service in property listing of b.service. ConsistsOf=
dependency cannot be specified directly.
そして、部品を追加することができますfoo-out.socket
。その後、停止するとソケットも停止します。foo-in.socket
PartOf=foo.service
[Unit]
foo.service
foo.service(触れない)
[Unit]
Description=foo Fifo test
After=network.target foo-in.socket foo-out.socket
Requires=foo-in.socket foo-out.socket
[Service]
Sockets=foo-out.socket
Sockets=foo-in.socket
StandardOutput=fd:foo-out.socket
StandardInput=fd:foo-in.socket
StandardError=journal
ExecStart=/path/to/foo/exec
foo-out.socket
[Unit]
Description=foo Task Writes to this
PartOf=foo.service
[Socket]
Service=foo.service
ListenFIFO=%t/foo/out
foo-in.socket
[Unit]
Description=foo Task reads commands from this
PartOf=foo.service
[Socket]
Service=foo.service
ListenFIFO=/run/user/1000/foo/in