.pidファイルは、プロセスが実行されているかどうかを判断するのに信頼できますか?


11

sshdなどの多くのプログラムは、プロセスIDを含む.pidファイルを/ var / run /に作成します。これらのファイルは、プロセスが実行されているかどうかを判断するのに信頼できますか?私の推測では、これらのファイルはプロセスによって手動で作成されているため、プログラムがクラッシュした場合でもファイルシステムに残ります。

回答:


16

簡単に言えば、いいえ:プロセス(デーモンなど)がクラッシュし、.pidファイルをクリアする時間がない可能性があります。

プログラムの状態をより確実にする方法:ソケットなどの明示的な通信チャネルを使用します。ソケットポートをファイルに書き込み、supervisorプロセスに調べさせます。

LinuxでDBusのサービスを使用することもできます。特定の名前を登録し、スーパーバイザプロセス(名前は何であれ)にその名前を確認させます。

数多くのテクニックがあります。

覚えておくべきことの1つは、PIDファイルを管理するのはOSの責任ではないということです。


1
ただし、プロセスの存在と結合されたpidファイルの存在で十分です。プロセスが終了した場合は、それを確認できます。PIDは再利用されますが、それほど頻繁ではありません。
MarkR、2010

2
pidが再利用される頻度は、問題の特定のシステムによって異なります。私は、システムが少なくとも毎日PIDサイクルされるのを見てきました。pidを確認する必要があります。プロセスが存在すること、およびそのプロセスがpidを所有すると予想されるプロセスのように見えることを確認してください。

@atk:まさに。それ自体は標準ではなく、たとえあったとしても、一部の実装では尊重されない場合があります。たとえば、PIDファイルをまったく書き込まないデーモンを作成し、バックチャネルを使用して管理コマンドを取得できます。
jldupont 2010

@atk:残念ながら、チェック時と使用
時の間に

3

Jldupontは、.pidファイルがクラッシュの場合にファイルが削除されない可能性があるため、プロセスが実行されているかどうかを判断するための信頼性が低いと述べています。

競合状態はさておき、プロセスが実行されているかどうかを知る必要があるときは、しばしば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は便利なコマンドですが、複数のインスタンスを実行していると問題が発生します。たとえば、通常のsshdがポートTCP / 22で実行されていて、別のsshdがポートTCP / 2222で実行されている場合、pgrepはsshdを検索するときに2つのプロセスIDを配信します...通常のsshdのpidが/ varにある場合/run/sshd.pidとその他のpidは/var/run/sshd-other.pidにあり、プロセスを明確に区別できます。

psだけを使用して、grepgrep -vで1つまたは複数のパイプにパイプして、興味のない他のすべてのものを除外しようとすることはお勧めしません...

find . | grep myfile

ファイルが存在するかどうかを判断します。


2

ファイルに含まれているのと同じpidを持つプロセスの存在を単純にチェックすることは信頼できません。

しかし、多くのpidfile実装はpidfileのロックも行うため、プロセスが停止した場合、ロックは解除されます。ロックメカニズムが信頼できる場合、ファイルがまだロックされているかどうかを確認することは、元のプロセスがまだ実行されているかどうかを判断するための比較的信頼できるメカニズムです。


1

Jldupontは正しいです。

ただし、プロセスに0シグナル(kill -s 0 pid)を送信して、プロセスがまだ存続しているかどうかを確認できます(そのようなシグナルを送信する権限がある場合)-通常、プロセスの所有者のみが送信できますそれは信号です)。


4
ただし、そのPIDを持つプロセスの存在を確認しても、それが目的のPIDであるとは限りません。
janm 2010

0

私はjschmierに同意します。

一部のシステムでは、pgrepにアクセスできません。このようなps -aef | grep <pid>場合は、プロセスが実際に実行されているかどうかを確認できます。


1
質問の要点は「信頼できる」でした。psを実行してPIDを探すことは信頼できません。
janm

まあ...あなたがそのプログラムの名前を知っていると仮定すると、なぜあなたはps -aefを考えるのですか?grepは信頼できませんか?
user29584 2010

3
競合状態:psが終了するまでにシステムの状態が変化しました。プロセスのタイトル:別のプロセスに、目的のプロセスと同様のタイトルを付けることができます。複数のインスタンス:同じサービスの2つのインスタンスがあり、それぞれにPIDファイルがあるシステムを考えてみます。1つは失敗し、もう1つは再起動して最初のサービスのPIDを取得します。どのようにわかりますか?等信頼できない、競合状態のために正しくすることが不可能である、そしてうまくいく信頼できる技術があります。信頼できる代替案については、たとえば、cr.yp.to
daemontools.htmlを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.