59

Unix での PID ファイルの適切な処理について詳しく説明している、評判の良いリファレンスはどこにありますか?

Unix オペレーティング システムでは、特殊なロック ファイル (PID ファイル) を使用してプログラム (多くの場合、デーモン) を「ロック」するのが一般的です。

これは予測可能な場所にあるファイルで、多くの場合「/var/run/foo.pid」です。プログラムは、起動時に PID ファイルが存在するかどうかを確認し、ファイルが存在する場合はエラーで終了することになっています。したがって、これは一種の助言的で協調的なロック メカニズムです。

このファイルには、現在ロックを保持しているプロセスの数値プロセス ID (したがって「PID ファイル」という名前) である 1 行のテキストが含まれています。これにより、ロックを保持しているプロセスへのシグナルの送信を自動化する簡単な方法が可能になります。

私が見つけられないのは、PID ファイルを処理するための予想される動作または「ベスト プラクティス」の動作に関する適切なリファレンスです。さまざまなニュアンスがあります: ファイルを実際にロックする方法 (気にしないでください。カーネルを使用しますか? プラットフォームの非互換性についてはどうですか?)、古いロックの処理 (静かに削除しますか? いつチェックするか?)、正確にいつロックを取得して解放するかなど。

この小さなトピックについて、尊敬され、最も権威のある参考文献(理想的には W. リチャード・スティーブンスのレベル) をどこで見つけることができますか?

4

5 に答える 5

23

まず、最近のすべての UNIX/var/runでは、再起動後も持続しません。

PID ファイルを処理する一般的な方法は、初期化中に作成し、通常のハンドラーまたはシグナル ハンドラーのいずれかの出口から削除することです。

ファイルをアトミックに作成/チェックするには、標準的な方法が 2 つあります。最近の主なものは、フラグを付けて開くことO_EXCLです。ファイルが既に存在する場合、呼び出しは失敗します。古い方法 ( のないシステムでは必須O_EXCL) は、ランダムな名前で作成してリンクすることです。ターゲットが存在する場合、リンクは失敗します。

于 2009-03-27T02:52:25.857 に答える
18

私の知る限り、PIDファイルは、尊敬されている、ほとんどが信頼できるソースを見つけることができるものではなく、慣例です。私が見つけた最も近いものは、ファイルシステム階層標準のこのセクションです。

このPerlライブラリは、作成者が少なくともいくつかの問題について考えているように見えるので、役立つかもしれません。

/ var / runの下のファイルは、デーモンの作成者ではなく、ディストリビューションメンテナによって処理されることが多いと思います。これは、すべてのinitスクリプトが一緒にうまく機能することを確認するのはディストリビューションメンテナの責任だからです。DebianとFedoraの開発者向けドキュメントを確認しましたが、詳細なガイドラインは見つかりませんでしたが、開発者向けのメーリングリストで詳細情報を入手できる可能性があります。

于 2009-03-27T03:22:09.623 に答える
12

Kerrisk のThe Linux Programming Interfaceのセクション 55.6 「Running Just One Instance of a Program」を参照してください。これは、Stevens の Unix Network Programming v2 の pidfile 実装に基づいています。

また、pidfile の場所は通常、(init スクリプトを介して) ディストリビューションによって処理されるものであるため、適切に作成されたデーモンはコマンドライン引数を使用して pidfile を指定し、これが構成ファイルによって誤って上書きされないようにすることにも注意してください。また、古い pid ファイルを単独で適切に処理する必要があります (O_EXCL は使用しないでください)。fcntl() ファイル ロックを使用する必要があります。デーモンの pidfile がローカル (非 NFS) ファイルシステムにあると想定できます。

于 2012-11-30T19:23:23.963 に答える
7

ディストリビューションによっては、実際にはpidfileを処理するinitスクリプトです。起動時に存在をチェックしたり、停止時に削除したりします。そうするのは好きではありません。私は独自のinitスクリプトを作成し、通常は標準のinit関数を使用しません。

適切に作成されたプログラム(デーモン)には、このpidfile(存在する場合)をどこに書き込むかを示す、ある種の構成ファイルがあります。また、シグナルを処理できる場合は常に、正常または異常な終了時にPIDファイルがクリーンアップされるようにシグナルハンドラーを確立するように注意します。次に、PIDファイルはinitスクリプトに正しいPIDを提供して、停止できるようにします。

したがって、起動時にpidfileがすでに存在する場合は、それが以前にクラッシュしたことを示す非常に優れた指標であり、何らかの回復作業を行う必要があります(該当する場合)。initスクリプト自体がPIDの存在をチェックしたり、リンクを解除したりする場合は、そのロジックを足元で撃ちます。

名前空間に関しては、プログラム名の後に続く必要があります。'foo-daemon'を開始している場合は、foo-daemon.pidになります。

/ var / lock / subsysも調べる必要がありますが、これは主にRedHatフレーバーで使用されます。

于 2009-03-27T03:13:46.943 に答える