アプリケーションのサービススクリプトを記述しようとしています。だから私はこのようにそれを制御することができます:
./myscript.sh start|stop|status
起動時にpid.file
とプロセスIDが作成され、それに基づいてステータスをチェックしてプロセスを停止できます。停止コマンドでpid.file
を削除します-大丈夫です。
しかし、アプリケーションが異常な方法でクラッシュした場合-電源を切るなど、pid.file
は削除されず、手動で削除する必要があります。
スクリプトでこの異常な状況を適切に処理するにはどうすればよいですか?
Pidが実行中であり、アプリケーションに属していることを確認できます。
pid=$(< "$pidfile") # a bash builtin way to say: pid=$(cat $pidfile)
if kill -0 $pid &&
[[ -r /proc/$pid/cmdline ]] && # find the command line of this process
xargs -0l echo < /proc/$pid/cmdline | grep -q "your_program_name"
then
# your application is running
true
else
# no such running process, or some other program has acquired that pid:
# your pid file is out-of-date
rm "$pidfile"
fi
PIDファイルは、作成したソフトウェアをアンインストールしない限り、削除しないでください。
PIDファイルは、主に同時実行に対する安全策です。 PIDファイルを削除すると、その目的は完全に無効になります。 PIDファイルのリンクを解除する瞬間に、任意の数のプロセスがそのファイルのon openファイル記述子を持ち、オペレーティングシステムによってそのファイルに排他ロックを取得する可能性があります。
@glenn_jackmanからの回答からのelseブランチは本当に削除する必要があります。
http://www.guido-flohr.net/never-delete-your-pid-file/ で、結果の競合状態を再現するためのコード例を含め、根本的な問題について詳しく説明しました。