2009-03-27 15 views
55

参考文献はUnix上でPIDファイルを適切に処理する方法を詳しく説明していますか?UnixでPIDファイルを正しく処理するためのリファレンス

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

これは予測可能な場所にあるファイルです(通常は '/var/run/foo.pid')。プログラムは起動時にPIDファイルが存在するかどうかをチェックし、ファイルが存在する場合はエラーで終了します。だから、それは一種の助言、コラボレーション・ロック機構です。

ファイルには、ロックを現在保持しているプロセスの数値プロセスID(したがって、名前 "PIDファイル")である1行のテキストが含まれています。これにより、ロックを保持しているプロセスに信号を送信することを簡単に自動化することができます。

私が見つけることができないものは、PIDファイルを処理するための予期された、または "ベストプラクティス"の動作に関する良い参考資料です。実際にファイルをロックする方法(カーネルを使用するのか、プラットフォームの非互換性をどうにかするのか)、ロックを自動的に処理する(チェックするときにはそれを静かに削除する)、正確にロックを取得して解放するとき、など。

この小さなトピックについては、最も信頼できる参照(理想的にはW. Richard Stevensのレベル)はどこにありますか?

+0

$ XDG_RUNTIME_DIRは、1000 + uidのユーザーとして実行している場合、pidファイルを置く場所です。 – Behrooz

答えて

16

私が知る限り、PIDファイルは、尊重され、主に権威のあるソースを見つけることができるものではなく、条約です。ファイルシステム階層標準のthis sectionです。

This Perl library作成者が発生する可能性のある問題を少なくとも考えているように見えるので、参考になるかもしれません。

私は、ディストリビューションの管理者がすべてのinitスクリプトがうまくいっていることを確認する責任があるので、/ var/runの下にあるファイルはデーモンの管理者が扱うことが多いと思います。私はDebianとFedoraのデベロッパードキュメントをチェックして詳細なガイドラインは見つけられませんでしたが、デベロッパーのメーリングリストについてもっと詳しく知ることができるかもしれません。

+0

ありがとうございます。他のフォーラムのコンセンサスは、これについての標準的な参照がないように思われる。 (FHSはファイルの場所と内容について簡単に言及し、行動については何も言及していません) – bignose

21

すべての現代UNIXで最初にオフ/var/runは再起動しても保持されません。

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

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

+3

"ファイルをアトミックに作成/チェックする標準的な方法は2つあります。"これはまさに私の質問に関するものです:このカノンはどこで標準的に記録されていますか? – bignose

+0

残念ながら、UNIXの操作方法の多くは、文化の中で伝承されています。 POSIX.1で説明されているシステムコールのマニュアルページを読むと(これは、man section 2で混乱するほど十分です)、ロックに適したいくつかの事が明らかになります。 flock()は信頼されていないので、これは2つだけ残し、1つはmkdirに関係します。 – Joshua

+2

公正な質問は「なぜ群れを信頼しないのか」です。答えは何年にもわたって壊れたシステムがあまりにも多くあり、nfsで正しく動作することはありません(nfslockプロトコル自体はスプリットマインドの問題を抱えています)。 – Joshua

7

実際には、pidfileを処理するinitスクリプトです。それは開始時に存在をチェックし、停止時に削除するなどします。私はそうするのが嫌いです。私は自分自身のinitスクリプトを書いており、通常はスタンダードのinit関数を使用しません。

よく書かれたプログラム(デーモン)には、このpidfile(もしあれば)を書かなければならない何らかの設定ファイルがあります。シグナルハンドラの確立にも注意を払い、シグナルを処理できるときはいつでも、PIDファイルが正常または異常終了時にクリーンアップされるようにします。 PIDファイルはinitスクリプトに正しいPIDを与え、停止させることができます。

したがって、起動時にpidファイルがすでに存在する場合は、以前にクラッシュしていたプログラムに対する非常に優れたインジケータで、何らかのリカバリ作業を行う必要があります(該当する場合)。 PIDの存在をチェックしているinitスクリプト自体を持っている、あるいはそれをリンクしていれば、足元でその論理を捉えることができます。

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

また、/ var/lock/subsysも参照する必要がありますが、これは主にRed Hatのフレーバで使用されます。

11

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

また、pidファイルの場所は通常distroによって(initスクリプトを介して)処理されるものであるため、よく書かれたデーモンはpidfileを指定するためにコマンドライン引数を受け取り、誤って設定ファイル。それはまた、正常にpidファイルを正常に処理する必要があります(O_EXCLは使用しないでください)。 fcntl()ファイルのロックを使用する必要があります。デーモンのpidファイルがローカル(NFS以外の)ファイルシステムにあると仮定できます。

+0

オンラインで情報がある場合は、「Linuxプログラミングインターフェイス」および/または「セクション55.6」を読んで、もっと。 – bignose

関連する問題