存在するこの回答ちなみに、init
デーモンが二重フォークと終了トリックを使って自分自身を親にするのは不適切です。答えはもはや存在しないウェブサイトにつながります。ところで、インターネットアーカイブで見つけました。。これにはいくつかの理由がリストされています。これは、「壊れる可能性がある、またはデーモン化を期待していないため、デーモン化しないでください。誰かが対話的にinit
実行している場合は、バックグラウンド実行を使用するか、明示的に要求する必要があり&
ますnohup
」になります。適切に設定されたデーモンは、制御を受けたときにすでに通常の環境で実行されている必要があるため、かなり説得力があるようです。 (理想的には素晴らしい自動化機能を備えたコンテナで実行されますが、これは別の話です。)
ところで、私たちがなぜそうするのか理解できません。setsid(2)
我々はそれを使用してはならない場合。私が理解できるsetpgid(2)
;(現代的な)シェルを実装するにはこれが必要ですが、次のようになります。ただこれを呼び出す信頼できる方法は、setsid(2)
デーモンを使用することです。マニュアルページではこれを行うように指示します。私はこれを使って最終的に実行されますが、login(1)
特権システムコールではなく、さまざまな低レベルのツールを実装するために使用できると想像していますsetsid(2)
。少なくともPythonの人々は、デーモンプロセスに親リセットが含まれているようです。そして、私はこれらの態度を他の多くの文脈(特にPEPに引用されている教科書のような学界)で見ました。
もう一つの参考として、daemonize(1)
そしてdaemon(3)
(一部のシステムでは)前者のマニュアルページに次のように表示されます。
デーモンとして実行するように設計されたほとんどのプログラムは、自分で[親のリダイレクトを含むさまざまなタスク]を実行します。しかし時々これをしない状況に直面するでしょう。実際のUnixデーモンに正しく変換できないデーモンを実行する必要がある場合は、daemonizeを使用して実際のデーモンとして強制的に実行することができます。
起動時のデーモンの正しい動作は何ですか?特に自分で再調整する必要がありますか?
答え1
私は常にsetsid()
会議の進行者がプロセス制御とターミナル信号の動作方法に関連していると思いました。プロセスグループより1レベル上です。
Stackoverflowへの回答おすすめPOSIX.1-2008、内容は次のとおりです。
3,339 会議
ジョブ制御目的に設定されたプロセスグループの集合。各プロセスグループはセッションのメンバーです。プロセスは、そのプロセスグループが属するセッションのメンバーと見なされます。新しく作成されたプロセスは、コンストラクタのセッションに参加します。プロセスはセッションメンバーシップを変更できます。 setid() を参照してください。同じセッションに複数のプロセスグループがある可能性があります。
そして第11章次に、プロセスグループとセッションの制御端末に基づいて信号を伝達する方法について説明します。
実際、私が見たLinuxシステムから論理的に独立したすべての「セッション」は別々のセッションIDで実行されているので、あなたが提案したとおりに動作しますlogin
。sshd
screen
setsid
デーモンが何をすべきかは、どの初期化システムが使用されるかによって異なります。 Linuxでは、既存のSystem V initスクリプトを使用して、デーモン自体(またはアシスタントの助けを借りて)バックグラウンドを設定する必要があります。 sysvinitを使用しているにもかかわらず、initスクリプトは管理者のシェルで直接実行できます。これはすべての場合にクリーンな環境ではない可能性があります。 (リソース制限などはセッションから継承できます。)
Upstart と Systemd では、init システムがフォークを実行できるため、デーモンが独自のフォークを実行しない方が良い場合があります。 (Upstartは特にいくつかのタスクを実行します。興味深いものフォークされたデーモンに従ってください。 )
(他のUnixについてはわかりませんが、@Stephen Harrisが言ったようにコメントしました。、デーモンが分岐と非分岐の動作をサポートすることをお勧めします。 )
ssh-agent
たとえば、通常、ユーザーが直接実行し、initシステムのサポートを必要としないことがあります。バックグラウンドでフォークしsetsid
、アクティブな状態を維持することができ、複数のシェルで使用できることは非常に便利です。 (screen
windows、xterm
s ...)起動時に便利な出力もあるので、実行はnohup
少し複雑です。
答え2
善良に行動するデーモンは、デーモンが期待するバイなので、自分でデーモン化しなければなりません。デーモンの開始フレームワークでデーモンが起動していない場合でも正常に動作します。
正しく機能するデーモンには、監督者が起動できるようにデーモン化しないオプションが必要です。 (最新のLinuxカーネルはデュアルフォークデーモンを簡単に監視できますが、すべてのシステムが最新のLinuxカーネルを実行しているわけではなく、すべてのモニタが最新のLinuxカーネルを使用しているわけではありません。)