システムサービスデバイスが無効になっている場合にコマンドを実行する方法は?

システムサービスデバイスが無効になっている場合にコマンドを実行する方法は?

ラップトップのバッテリーしきい値を設定するには、次のシステムサービスデバイスがあります。

[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

見てExecStopください。ExecStopPost

実行が停止しました

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

...

この設定は、完全なシャットダウンを要求するサービスと通信するコマンドに推奨されます。このオプションで指定されたコマンドを実行すると、サービスがまだ完全に開始されており、すべてのコマンドに正しく応答できると想定する必要があります。ポストクリーンアップ手順では、代わりにExecStopPost =を使用してください。

実行が停止した後

サービスが停止した後に実行する追加のコマンド。これには、ExecStop =に設定されたコマンドが使用されているか、サービスにExecStop =が定義されていないか、サービスが予期せず終了する状況が含まれます。このパラメータは、ExecStart =について説明したのと同じスキームに従う複数のコマンドラインを使用します。これらの設定の使用はオプションです。指定子と環境変数の置換をサポートします。 ExecStop =とは異なり、この設定で指定されたコマンドは、サービスが正しく開始されず、再び終了したときに呼び出されます。

この設定は、サービスが正しく開始されない場合でも実行する必要があるクリーンアップ操作にお勧めします。この設定で構成されたコマンドは、サービスが途中で開始されず、不完全に初期化されたデータが残っている場合でも実行できるはずです。この設定で指定されたコマンドが実行されると、サービスのプロセスはすでに終了しているため、そのプロセスと通信しようとしないでください。

この設定で構成されたすべてのコマンドは、$ SERVICE_RESULT、$ EXIT_CODE、および$ EXIT_STATUS環境変数に設定されているサービスの結果コード、および基本プロセスの終了コードと状態で呼び出されます。 exec(5) 詳細を参照してください。 。

どちらもサービスが停止している間にコマンドを実行するために使用できます。

2つの主な違いは次のとおりです。

  • ExecStop基本プロセスの実行中は実行され、正常に実行された後にサービスが停止した場合にのみ実行されます。つまり、すべてのサービスが成功ExecStartし、ExecStartPreすべてのサービスConditions... も通過する必要があります。

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

おすすめ記事