これも興味深い概念です。デーモンは英語で「エルフ」を意味し、漫画の主人公の周りを回って回ることがよくあります。時には長々としたアドバイスをくれたり、運悪く柱にぶつかったりすることもあります。そのため、デーモンは「守護神」と訳されることもあります。そのため、中国でもデーモンプロセスには「エルフプロセス」と訳す人もいますし、「デーモンプロセス」と訳す人もいます。
本物のデーモンと同様に、デーモン プロセスも人々の目から隠れて、静かにシステムに貢献することに慣れており、人々はそれらを「バックグラウンド サービス プロセス」と呼ぶこともあります。一般に、デーモン プロセスの存続期間は非常に長く、実行された瞬間からシステム全体がシャットダウンされるまで終了しません。有名な Apache や wu-FTP を含むほとんどすべてのサーバー プログラムは、デーモン プロセスの形式で実装されています。 Linux での inetd や ftpd などの多くの一般的なコマンドでは、末尾の文字 d はデーモンを指します。
なぜデーモンプロセスを使用する必要があるのですか? Linux の各システムがユーザーと通信するためのインターフェイスは、この端末から実行を開始するすべてのプロセスの制御端末 (制御端末) と呼ばれます。終了すると、対応するプロセスが自動的に終了します。この点に関しては、読者は X-Window の XTerm を使って試すことができます (各 XTerm はオープン ターミナルです)。次のようなコマンドを入力してアプリケーションを起動できます。 $netscape 次に、XTerm ウィンドウと起動したばかりの Netscape を閉じます。窓も一緒に突然蒸発してしまいます。ただし、デーモンプロセスは、対応するターミナルが閉じられている場合でも、ユーザーの影響を受けずにシステム内に長時間存在することができます。ターミナルまたはその他の変更が影響を受ける場合は、このプロセスをデーモン プロセスに変える必要があります。
プロセスをデーモンプロセスに変えたい場合は、次の手順に厳密に従う必要があります:
1. fork を呼び出して子プロセスを生成し、同時に親プロセスを終了します。その後の作業はすべて子プロセスで行われます。これにより、次のことが可能になります:
2. setid システムコールを呼び出します。これはプロセス全体の中で最も重要なステップです。その機能は、新しいセッションを作成し、セッション リーダーとして機能することです。呼び出しプロセスがプロセス グループのリーダーである場合、呼び出しは失敗しますが、これは手順 1 で保証されています。 setid の呼び出しには 3 つの機能があります:
3. 現在の作業ディレクトリをルート ディレクトリに変更します。
このプロセスを /mnt/floppy/ などの一時的にロードされたファイル システム上で実行すると、プロセスの現在の作業ディレクトリは /mnt/floppy/ になります。このファイル システムを使用しているかどうかに関係なく、プロセス全体の実行中はファイル システムをアンマウント (umount) することはできず、非常に不便になります。解決策は、chdir システム コールを使用して現在の作業ディレクトリをルート ディレクトリに変更することです。ルート ディレクトリを削除したい人はいないでしょう。
もちろん、このステップでは、特別な必要がある場合、現在の作業ディレクトリを別のパス (/tmp など) に変更することもできます。
4. ファイル許可マスクを 0 に設定します。
これにはシステムコール umask を呼び出す必要があります。付録 3 を参照してください。各プロセスは、親プロセスからファイル許可マスクを継承します。新しいファイルが作成されると、このマスクはファイルのデフォルトのアクセス許可を設定し、一般ユーザーの書き込み許可などの特定の許可をブロックするために使用されます。別のプロセスが exec を使用して、私たちが作成したデーモン プログラムを呼び出すと、そのプロセスのファイル許可マスクが何であるかがわからないため、新しいファイルを作成するときに何らかの問題が発生します。したがって、ファイル許可マスクをリセットする必要があります。これは任意の値に設定できますが、一般的には、ユーザー操作がブロックされないように、誰もがそれを 0 に設定します。
アプリケーションに新しいファイルの作成やファイル アクセス許可の設定がまったく含まれていない場合は、ファイル許可マスクを完全に開始して、この手順をスキップできます。
5. 不要なファイルをすべて閉じます。
ファイル許可マスクと同様に、新しいプロセスは親プロセスから開いているファイルの一部を継承します。これらの開かれたファイルは、デーモン プロセスによって読み書きされることはありませんが、それでもシステム リソースを消費し、ファイルが配置されているファイル システムをアンマウントできなくなる可能性があります。ファイル記述子 0、1、2 を持つ 3 つのファイル (ファイル記述子の概念については次の章で説明します) (通常、入力ファイル、出力ファイル、エラー ファイルと呼ばれるもの) も閉じる必要があることに注意してください。 。おそらく多くの読者はこれに驚かれるでしょう。インプットとアウトプットは必要ではないでしょうか。しかし実際には、上記のステップ 2 の後、デーモン プロセスは、それが属する制御端末との接続を失い、端末から入力した文字はデーモン プロセスに到達できなくなり、デーモン プロセスは従来の方法 (printf など) を使用して出力します。また、弊社の端末では文字を表示することができません。したがって、これら 3 つのファイルは存在価値を失っているため、閉じるべきです。
前回の記事ではGearmanの使い方を紹介しました。私のプロジェクトでは、PHP を使用して、常に実行されるワーカーを作成します。 Gearman が推奨する例に従い、単純なループでタスクを待機する場合、次のようないくつかの問題が発生します。 1. コードを変更した後、コードの変更を有効にする方法 2. ワーカーを再起動するとき。 、タスク処理が完了した後に現在の再起動を確認する方法。
この問題に対応して、次の解決策を検討しました:
最後に、2 つの方法 4 と 5 を組み合わせることで、このようなデーモンを実装できます。設定ファイルが変更されると、ユーザーの kill -1 pid シグナルを受信すると、デーモンも自動的に再起動します。
コードは次のとおりです:
れーれー