回答:
簡単に言えば、いいえ:プロセス(デーモンなど)がクラッシュし、.pidファイルをクリアする時間がない可能性があります。
プログラムの状態をより確実にする方法:ソケットなどの明示的な通信チャネルを使用します。ソケットポートをファイルに書き込み、supervisor
プロセスに調べさせます。
LinuxでDBusのサービスを使用することもできます。特定の名前を登録し、スーパーバイザプロセス(名前は何であれ)にその名前を確認させます。
数多くのテクニックがあります。
覚えておくべきことの1つは、PIDファイルを管理するのはOSの責任ではないということです。
プロセス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は便利なコマンドですが、複数のインスタンスを実行していると問題が発生します。たとえば、通常のsshdがポートTCP / 22で実行されていて、別のsshdがポートTCP / 2222で実行されている場合、pgrepはsshdを検索するときに2つのプロセスIDを配信します...通常のsshdのpidが/ varにある場合/run/sshd.pidとその他のpidは/var/run/sshd-other.pidにあり、プロセスを明確に区別できます。
私はpsだけを使用して、grepとgrep -vで1つまたは複数のパイプにパイプして、興味のない他のすべてのものを除外しようとすることはお勧めしません...
find . | grep myfile
ファイルが存在するかどうかを判断します。
Jldupontは正しいです。
ただし、プロセスに0シグナル(kill -s 0 pid)を送信して、プロセスがまだ存続しているかどうかを確認できます(そのようなシグナルを送信する権限がある場合)-通常、プロセスの所有者のみが送信できますそれは信号です)。
私はjschmierに同意します。
一部のシステムでは、pgrepにアクセスできません。このようなps -aef | grep <pid>
場合は、プロセスが実際に実行されているかどうかを確認できます。