プログラムでサービスの状態を確認するコードを書こうとしますが、サービス名のタイプミスにも強力です。私の考えでは、合理的なプログラムは次のような振る舞いと意味を持つべきです。
- ユニット名を引数として使用します。
- デバイスが見つかったら、サービスのステータスを印刷し、ステータス0(アクティブ、非アクティブなど)で終了します。
- 単位が次の場合いいえ検出/ロードされた場合、エラーを印刷し、ゼロ以外の状態で終了します。
特に、以下はこの要件を満たしていません。
systemctl is-active servicename
(デバイスがアクティブでない場合はゼロ以外の戻り状態で終了し、servicenameがロードされていない場合でも同じように動作します)systemctl is-failed servicename
(上記と同様の動作)systemctl show servicename -pActiveState
(servicenameがロードされていない場合、終了ステータスは0です)
これが最も近いようですが、タイプミスがあるかどうかsystemctl show servicename -pLoadState -pActiveState
を確認するためにLoadState文字列を解析する必要があります。これは、この単純な操作に必要なものよりも複雑に見えます。
どんな提案がありますか?
答え1
どんな提案がありますか?
システム化された人は、2014年以来まだ存在するバグを修正することをお勧めします。
マニュアルsystemctl
には、systemdから呼び出される適切なLSBバージョン3終了ステータスが文書化されており、EXIT_PROGRAM_OR_SERVICES_STATUS_UNKNOWN
この終了ステータスは次のとおりです。でも使用systemctl status
存在しないサービスの場合、存在するが実行されていないサービスと区別します。
ただし、使用されていませんsystemctl is-active
。
追加読書
- バンダーバーグ(2014-12-18)。
systemctl status
正常に完了したサービスが障害状態で終了しました。。バグ#77507。 freedesktop.org. - Lennart Petlinget al。 (2017). 」終了ステータス..systemd
systemctl
のマニュアルページ。