ExecCondition
シャットダウンを使用してもstatus=1/FAILURE
デーモンの起動を妨げないサービスファイルがあります。
私は文書によると、デーモンが始まるだけでなく、他のすべてのExecStartPre
コマンドが実行されるのを防ぐ必要があると思います。
ExecCondition =コマンドが終了コード1〜254(含む)で終了すると、残りのコマンドはスキップされ、デバイスは失敗としてマークされません。
毎回明らかに失敗する条件を立てました。ExecCondition=-sh -c 'exit(1)'
ここにサービスファイルがあります(無実の人々を保護するために名前が変更されました)。
[Unit]
Description=Application
Wants=x-ray.service yankee.service zulu.service
Requires=alpha.service bravo.service
After=x-ray.service charlie.service bravo.service
[Service]
ExecCondition=-sh -c 'exit(1)'
ExecStartPre=-sh -c 'prestartShellScript.sh'
ExecStart=/opt/app/app argument1 argument2
WatchdogSec=10
Restart=always
RestartSec=10
WorkingDirectory=/opt/app
TimeoutSec=10
[Install]
WantedBy=multi-user.target
ただし、サービスを開始すると、systemctl status app
次のようにアプリケーションが実行中であり、他のプロセスも実行中であることがわかります。
Active: active (running) since Fri 2020-02-07 18:06:57 UTC; 6s ago
Process: 33783 ExecCondition=/bin/sh -c exit(1) (code=exited, status=1/FAILURE)
Process: 33796 ExecStartPre=/bin/sh -c prestartShellScript.sh (code=exited, status=0/SUCCESS)
Main PID: 33827 (app)
Tasks: 19 (limit: 4177)
Memory: 101.5M
CGroup: /system.slice/app.service
└─33827 /opt/app/app argument1 argument2
私もExecCondition
変わったのにExecStartPre
同じ症状が出ますね。
答え1
コマンドの前には、-
すべてのExec * =パラメータで許可されている共通フラグであるが、特に「終了コードを無視してコマンドを常に成功したものとして扱う」という意味です。-
コマンドが障害を報告したときにsystemdが装置を失敗させたい場合は、使用しないでください。