私が知っている限り、さまざまな記事を通してここ、デーモンプロセスには次の特徴があります。
- 親プロセス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です。
答え2
これは、単にデーモンの親プロセス(pid 677)が新しいセッションを開始して分岐し、子プロセス(pid 678)がそのセッションを継承して実行され続けることを意味します。
これは、いくつかのラッパースクリプトを使用して何かをデーモン化する場合(そして何らかの理由でその目標が実行されない場合 - おそらく再起動を処理する場合)、または単にプロセスが安定した状態に入る前に再分岐することを選択しますが原因で発生する可能性があります。
私が言いたいのはプロセスです。効果的にPPIDが1で制御端末がない場合はデーモンプロセスです。セッションID /プロセスグループID制約も通常は正確ですが、デーモンの動作には実際には必要ありません。