UNIXベースのシステムにサービスを展開するときのsysadminの観点との実際的な違いは何ですか?
UNIXベースのシステムにサービスを展開するときのsysadminの観点との実際的な違いは何ですか?
回答:
デーモン化の従来の方法は次のとおりです。
fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()
これにより、プロセスが端末と同じプロセスグループに含まれなくなり、プロセスと一緒に強制終了されなくなります。IOリダイレクトは、出力が端末に表示されないようにすることです。
&
回答に部品の説明を追加してください。元の質問を確認すると、不完全なようです。
デーモンの場合、必要なのは何にも結び付けられないプロセスです。少なくとも、それはそれ自身のセッションにあり、端末にアタッチされず、親から継承されたファイル記述子を何も開かないようにし、親が(init以外の)あなたの世話をしないようにしますディレクトリを/
アンマウントを妨げないように...
ターミナルからデタッチするには、新しいセッションを作成しますが、セッションを作成するには、グループ(またはセッション)リーダーであってはなりません。新しいプロセスをフォークするのが最善です。親が終了すると仮定すると、それはプロセスがもう親を持たず、initによって採用されることを意味します。次に、可能なファイル記述子をすべて閉じますchdir("/")
(現在の作業ディレクトリを閉じて、ファイル記述子のようにそのリソースを解放すること/
はできません。少なくとも現在の作業ディレクトリを作成しても、ディレクトリのアンマウントは妨げられません)。
そのプロセスはセッションリーダーであるため、端末デバイスを開くと、その端末の制御プロセスになるリスクがあります。もう一度フォークすると、それが起こらないことが保証されます。
一方、&では、インタラクティブシェルでは(端末のフォアグラウンドプロセスグループに含まれないように)新しいプロセスグループをフォークして作成し、非インタラクティブシェルではプロセスをフォークしてSIGINTを無視します。ターミナルからデタッチせず、ファイル記述子を閉じません(ただし、一部のシェルはstdinを再度開き/dev/null
ます)...
command &
あなたのプロセスがSIGHUP信号によって殺される親が死ぬとき。
ただし、システム管理者はいくつかの回避策にアクセスできます。
bashシステムでは、次を使用できます。
(trap '' HUP; command) &
これはサブシェルを開き、HUP
空のハンドラーでシグナルをトラップし、アンパサンド/フォークします。
出力は依然として間違った場所にリダイレクトされる可能性がありますtty
。または迷子になります。
あなたが解決するかもしれないと&>command.out
、1>output.out
または2>errors.out
ほとんどのシステムでは、nohup
コマンドにアクセスすることもできます。
nohup
このプロセスを大幅に簡素化します。これはかなり標準的なものですが、多くのbusybox組み込みARMディストリビューションに欠けていることがわかりました。あなたはただ書く:
nohup command &
..これで完了です。出力はIIRCにリダイレクトされnohup.out
ますが、このファイル名はオプションで変更できます。
command &
後でシェルから切り離すことができ、それがポストノーフとして機能することに注意してくださいdisown
。