web-dev-qa-db-ja.com

Apacheが独自のプロセスIDをhttpd.pidに書き込むのはなぜですか?

私はApacheと、それによって引き起こされるデバッグの問題に不慣れです。 Apacheが起動すると、説明されているように、独自のプロセスIDがhttpd.pidで人間が読める形式で書き込まれることがわかりました here

そもそもなぜプロセスIDが必要なのかよくわかりません。それが必要だとしても、私はこのアプローチの理由を理解していません。

Linuxでは、プロセスはps -efなどを使用してApacheのプロセスIDを見つけることができます。一般に、他のプロセスがプロセスIDをファイルに書き込んでいることは聞いたことがありません。

このApacheプロセスの何が特別なのですか?

6
p2pnode

ほとんどのUnixシステムでは、サービスはinitシステムによって開始および停止されます。多くのLinuxディストリビューションはレガシーsysvinitを使用していますが、これにはサービス管理機能がほとんどないため、/etc/init.dまたは/etc/rc.dのスクリプトはApacheを起動または強制終了する実際の仕事。これらのinitscriptsはプレーンshで記述されており、他の追跡手段はありません。事前設定された場所からPIDを読み取る以外の方法で起動するプロセス。 (initscriptは、直接起動したプロセスのPIDSのみを認識できますが、それらのプロセスの子や、同じスクリプトが最後に呼び出されたときに起動されたプロセスは認識できません。これは、initscriptが、それ自体を「デーモン化」するようにプログラムされたプロセスを追跡できないことを意味します。)

(はい、プロセスはps -efを使用するか、/procを直接調べることで見つけることができます。ただし、これはやや信頼性の低い方法です。たとえば、mpmなどの複数のApacheプロセスが同時に実行されている可能性があります。 -prefork、または複数の独立したApache構成。このため、ほぼすべてのデーモン Linuxでは、/runまたは/var/runに「pidfile」が作成されます。 initscriptで簡単に停止できます。crond.pidntpd.pidrsyslogd.pidsshd.pidなどがあります。)

ごく最近のLinuxinitシステムだけが追跡プロセスに煩わされます:UbuntuのUpstartは、予想されるフォークの数を正確に通知する必要がありますが、Fedoraのsystemdは、カーネルcgroupsを使用して、サービスに属するプロセスを追跡します。

9
user1686

その理由は、サードパーティがsignalsを使用して、 kill(1) を使用して実行を制御できるためです。 Apacheインスタンス。たとえば、構成を適切に再ロードするように指示します。

他の答えはまだ当てはまります。

また、同じマシン上でさまざまなポートおよびさまざまな構成でApacheの複数のインスタンスを実行できることにも注意してください。 (デフォルトのIIRC)フォークモードを使用すると、さらに興味深いものになります。子プロセスの大群のApacheの制御インスタンスを把握できる必要があるため、これが最も実用的な方法です。

2
0xC0000022L

他の回答が言ったように、シグナルを送信するためのプロセスIDが必要です。これはデーモンプロセスであるため、シグナルは通信するための主要な方法の1つです。 Apacheを終了し、configなどをシグナルでリロードするように指示できます。

(通常)Apacheには親子関係があり、親は子をfork/reapsするコントローラーであるため、Apacheとプロセスモデルではより重要です。サーバーを停止する場合は、子ではなく親にシグナルを送信する必要があります。 psを実行したばかりの場合は、この親子関係を調べて親を見つける必要があります。そうして初めて、あなたはそれに信号を送ることができました。

1
Rich Homolka

Apacheは、Apacheの別のインスタンスがすでに実行されているかどうかを知りたいと考えています。プロセス番号の書き込みは、psを使用するよりも信頼性が高く、プロセスが予期せずシャットダウンしたかどうかをテストできます(.pidファイルを削除せずに)。また、psが特定のシステムで使用できるという保証もありません(たとえば、アクセス許可のため)。

他の多くのプログラムも.pidファイルを使用します。 /var/runディレクトリを確認してください。鉱山にはいくつかあります。

1
SigueSigueBen