システムサービスユニットにサードパーティの実行可能ファイルをラップして管理します。私はこのプログラムの動作を変えることができず、その終了コードも信頼しません。終了コード 0 や外部 SIGTERM を含む systemd によって発生しなかった終了を失敗として扱い、systemd のインタフェースを介して違いを検出できるようにしたいと思います。
現在私のデバイスは次のとおりです。
[Unit]
Description=Foo service
Requires=bar.service
After=bar.service
[Service]
ExecStart=/opt/foo/foo -stayresident
KillMode=control-group
Restart=no
サービスプロセスを手動で終了すると、ステータスを確認すると「非アクティブ」状態になります。systemctl
killall foo && systemctl status foo.service
killにアップグレードすると-9
「失敗」が発生します。
killall -9 foo && systemctl status foo.service
これは私が拡張したい行動です。
わかりましたSuccessExitStatus=
サービス単位の設定では、ゼロ以外の終了およびその他の障害タイプを成功として計算できますが、その逆は表示されません。
ベストアンサー1
おそらく必要なものを理解していないかもしれませんが、foo
コマンドの後に失敗したコマンドを追加するなどの簡単な操作を実行できます。 2番目のコマンドはによって実行されませんsystemctl stop
。たとえば、次のようExecStart
に置き換えます。
ExecStart=/bin/bash -c '/opt/foo/foo -stayresident && exit 7'
7は、状態でより明確に見えるように選択されています。シグナルによって終了するか、それfoo
自体で終了すると、シェルプロセスは引き続き実行され、終了コード7とシステム状態になります。失敗。完了すると、systemctl stop
シェルは状態で終了します。非アクティブ(死)。自然に放出されたすべての障害信号は、exit 7
元のコマンドが成功した場合にのみfoo
保持することができます。
コマンドkillall foo
の一致を防ぐには、次のトリックを使用できます。bash
bash -c '/opt/"f"oo/"f"oo ...'