ExecStopPostメソッド

ExecStopPostメソッド

現在、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.socketPartOf=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

関連情報