解決策 1:
簡単に言えば、いいえ :プロセス (デーモンなど) がクラッシュし、その .pid ファイルをクリアする時間がない可能性があります。
プログラムの状態をより確実にする手法:ソケットなどの明示的な通信チャネルを使用します。ソケット ポートをファイルに書き込み、supervisor
を指定します。 プロセスを参照してください。
Linux で DBus のサービスを使用することもできます。特定の名前を登録し、スーパーバイザー プロセス (名前は何でも) にその名前をチェックさせます。
数多くのテクニックがあります。
覚えておくべきことは、PID ファイルを管理するのは OS の責任ではないということです。
解決策 2:
.pid ファイルは信頼できないと述べている Jldupont は正しい クラッシュが発生した場合にファイルが削除されない可能性があるため、プロセスが実行されているかどうかを判断します。
競合状態は別として、よく pgrep を使用します プロセスが実行されているかどうかを知る必要がある場合。必要に応じて、出力を .pid ファイルと相互参照できます。
解決策 3:
プロセス ID を含むファイルは、プロセスが実行されているかどうかを判断する信頼性がありません。プロセスに最後に与えられたプロセス ID を把握するための信頼できる情報源です。
プロセス ID を取得したら、プロセスが実際に実行されているかどうかをさらに確認する必要があります。
以下に例を示します:
#!/usr/bin/env sh
file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)
if [ ! -f ${file} ]; then
echo "File does not exists: ${file}"
exit 1
fi
if [ ! -r ${file} ]; then
echo "Insufficient file persmissons: ${file}"
exit 1
fi
psoutput=$(ps -p ${processid} -o comm=)
if [ $? == 0 ];then
if [ ${psoutput} == "sshd" ]; then
echo "sshd process is realy running with process id ${processid}"
exit 0
else
echo "given process id ${processid} is not sshd: ${psoutput}"
exit 1
fi
else
echo "there is no process runing with process id ${processid}"
exit 0
fi
pgrep は便利なコマンドですが、複数のインスタンスを実行していると問題が発生します。たとえば、ポート TCP/22 で実行されている通常の sshd があり、ポート TCP/2222 で実行されている別の sshd がある場合、pgrep は sshd を検索するときに 2 つのプロセス ID を提供します。 ... 通常の sshd の pid が /var/run/sshd.pid にあり、他の sshd の pid が /var/run/sshd-other.pid にある場合、プロセスを明確に区別できます。
しない ps のみを使用することをお勧めします 、grep を使用して 1 つまたは複数のパイプを介して配管する およびgrep -v 興味のない他のすべてのものを除外しようとしています...それは
を使用するのと少し似ていますfind . | grep myfile
ファイルが存在するかどうかを確認します。
解決策 4:
ファイルに含まれているのと同じ pid を持つプロセスの存在を単純にチェックするのは信頼できません。
しかし、多くの pidfile 実装は pidfile のロックも行うため、プロセスが終了するとロックは解除されます。ロック メカニズムが信頼できる場合、ファイルがまだロックされているかどうかを確認することは、元のプロセスがまだ実行されているかどうかを判断するための比較的信頼できるメカニズムです。