systemd サービス ユニットが無効になっているときにコマンドを実行するにはどうすればよいですか?

systemd サービス ユニットが無効になっているときにコマンドを実行するにはどうすればよいですか?

ラップトップのバッテリーしきい値を設定するために、次の systemd サービス ユニットを使用しています。

[Unit]
Description=Set Battery Charge Thresholds

[Service]
Type=oneshot
ExecStart=/usr/bin/tpacpi-bat -s --start 1 30
ExecStart=/usr/bin/tpacpi-bat -s --stop 1 85
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

私が望んでいるのは、サービス ユニットを無効にするときにコマンドを実行する方法です (しきい値をデフォルトに簡単に戻すことができます)。これは可能ですか?

答え1

見てみましょExecStopExecStopPost

エグゼクティブストップ

ExecStart= で開始されたサービスを停止するために実行するコマンド。この引数は、上記の ExecStart= で説明したのと同じスキームに従って、複数のコマンドラインを取ります。この設定の使用はオプションです。このオプションで設定されたコマンドが実行されると、サービスに残っているすべてのプロセスが KillMode= 設定に従って終了します (systemd.kill(5) を参照)。このオプションが指定されていない場合、サービス停止が要求されたときに KillSignal= で指定されたシグナルを送信してプロセスを終了します。指定子と環境変数の置換がサポートされています ($MAINPID を含む、上記を参照)。

...

クリーン終了を要求するサービスと通信するコマンドには、この設定を使用することをお勧めします。このオプションで指定されたコマンドが実行されると、サービスがまだ完全に稼働しており、すべてのコマンドに正しく応答できると想定されます。事後クリーンアップ手順の場合は、代わりに ExecStopPost= を使用します。

ExecStopPost

サービスが停止した後に実行される追加のコマンド。これには、ExecStop= で構成されたコマンドが使用された場合、サービスに ExecStop= が定義されていない場合、またはサービスが予期せず終了した場合が含まれます。この引数は、ExecStart= で説明したのと同じスキームに従って、複数のコマンド ラインを取ります。これらの設定の使用はオプションです。指定子と環境変数の置換がサポートされています。ExecStop= とは異なり、この設定で指定されたコマンドは、サービスが正しく起動せず、再度シャットダウンされたときに呼び出されることに注意してください。

この設定は、サービスが正常に起動できなかった場合にも実行されるクリーンアップ操作に使用することをお勧めします。この設定で構成されたコマンドは、サービスが途中で起動に失敗し、不完全に初期化されたデータが残っていても動作できる必要があります。この設定で指定されたコマンドが実行されると、サービスのプロセスはすでに終了しているため、サービスとの通信を試みるべきではありません。

この設定で構成されたすべてのコマンドは、サービスの結果コード、および $SERVICE_RESULT、$EXIT_CODE、および $EXIT_STATUS 環境変数で設定されたメインプロセスの終了コードとステータスを使用して呼び出されることに注意してください。詳細については、systemd.exec(5) を参照してください。

これらは両方とも、サービスが停止しているときにコマンドを実行するために使用できます。

両者の主な違いは次のとおりです。

  • ExecStopメイン プロセスがまだ実行されている間に実行され、サービスが正常に実行された後に停止された場合にのみ実行されます (つまり、すべてのサービスExecStartExecStartPre成功し、いずれかConditions... が合格する必要があります)。

  • ExecStopPostは、「サービスが予期せず終了した」場合でも実行され、失敗をカバーします。これの最大の利点は、複数の がある場合ExecStart、そのうちの 1 つが成功し、他の 1 つが失敗した場合に、ExecStopPost部分的な成功をクリーンアップするために使用できることです。

関連情報