私が知っている限り、さまざまな記事を通してここ、デーモンプロセスには次の特徴があります。
- 親プロセスIDは1でなければなりません。
- このプロセスには端末を接続しないでください。
- プロセスのプロセスID、セッションID、プロセスグループIDは同じでなければなりません。
私のシステムの一部のデーモンでは動作しているようです。しかし、avahi-daemon
私のシステムのPIDは678で、他の2つのIDは677です。なぜですか?
デーモンを識別する他の機能もありますか?
ベストアンサー1
あなたの性格はあまりにも限られています。ここで重要な概念は次のとおりです。デーモンはバックグラウンドプロセスなので、端末を制御するプロセスにすることはできず、制御端末を所有することもできません。。この単純な「ルール」を使用すると、デーモンはターミナルを開く/閉じる、ユーザーのログイン/ログアウト後も生き残ることができます。
各端末には、その端末によって生成された一連のプロセスである制御セッションがあります。セッションリーダー(通常はシェル)は端末の制御プロセスです。この端末はシェルの制御端末とみなされます。
なぜならあなたは読むことができるからです。これは私の質問の1つに対する答えです。、端末が閉じると、SIGHUP
制御プロセス(シェル)に信号を送信します。これは通常、シェルがSIGHUP
受信したデータをすべてのジョブに再送信するため、シェルに接続されているすべてのプロセスを終了します。
悪魔〜しなければならないユーザーのログインとログアウトを維持する必要があるため、このチェーンを避けてください。したがって、親シェルから分離する必要があります。一般的なアプローチはデュアルフォークです。
- デーモンは子プロセスを生成します。
- デーモンプロセスは「デフォルト」/親プロセスを終了します。
- 子供のためのすべての作業が完了しました。
シェルは子プロセスを追跡しないため、残りのSIGHUP
デーモンにメッセージを送信しません。この設定では、孫(デーモン)にはデフォルトで次のものが必要です。
- 他のプロセスと同様に、独自のPIDがあります。
- 現在終了している親項目のPGID。
- 最も近いサブハーベスタのPPIDであり、通常PID 1です。
- 現在終了している親項目の SID。通常はシェルのSIDでもあります。
親プロセスを終了することは特に必要ではありません。プロセスは端末で終了します。しかし、役に立たないプロセスを避けるために、子プロセスが動作を開始する直前に親プロセスを終了する方がよりきれいです。
この場合、プロセスはできるデーモンプロセスと呼ばれます。端末を閉じても終了しません。しかし、デーモンにまったく新しいセッションを提供するのが一般的です。 APIレベルでは、setsid
システムコールを使用してこれを行います。使用した後は、プロセスに次のものを含める必要があります。
- 変更されていないPID。
- 変更されていないPPID(最も近いサブリッパー)。
- 全く新しいSID。通常はPIDと同じです。
- 同じグループのプロセスも同じセッションにある必要があるため、まったく新しいGIDです。