web-dev-qa-db-ja.com

サービススクリプトでのpid.fileの削除を適切に処理する方法

アプリケーションのサービススクリプトを記述しようとしています。だから私はこのようにそれを制御することができます:

./myscript.sh start|stop|status

起動時にpid.fileとプロセスIDが作成され、それに基づいてステータスをチェックしてプロセスを停止できます。停止コマンドでpid.fileを削除します-大丈夫です。

しかし、アプリケーションが異常な方法でクラッシュした場合-電源を切るなど、pid.fileは削除されず、手動で削除する必要があります。

スクリプトでこの異常な状況を適切に処理するにはどうすればよいですか?

4
zella

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
2
glenn jackman

PIDファイルは、作成したソフトウェアをアンインストールしない限り、削除しないでください。

PIDファイルは、主に同時実行に対する安全策です。 PIDファイルを削除すると、その目的は完全に無効になります。 PIDファイルのリンクを解除する瞬間に、任意の数のプロセスがそのファイルのon openファイル記述子を持ち、オペレーティングシステムによってそのファイルに排他ロックを取得する可能性があります。

@glenn_jackmanからの回答からのelseブランチは本当に削除する必要があります。

http://www.guido-flohr.net/never-delete-your-pid-file/ で、結果の競合状態を再現するためのコード例を含め、根本的な問題について詳しく説明しました。

0
user2009165