プログラムをデーモンとして実行することと、「&」でバックグラウンドにフォークすることの違いは何ですか?


回答:


31

デーモン化の従来の方法は次のとおりです。

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()

これにより、プロセスが端末と同じプロセスグループに含まれなくなり、プロセスと一緒に強制終了されなくなります。IOリダイレクトは、出力が端末に表示されないようにすることです。


5
バックグラウンドプロセス(&)を生成する端末が閉じられた場合、バックグラウンドプロセスも終了しますか?
user1561108

9
プロセスは、端末が終了するとSIGHUPを受け取ります。そのシグナルのデフォルトのハンドラは、プロセスを終了することです。
デニスカースメーカー

12
&回答に部品の説明を追加してください。元の質問を確認すると、不完全なようです。
mtk

1
これは、&を使用してバックグラウンドで物事を実行しても、プロセスに特別なことをさせないからです:)
デニスカースメーカー

33

デーモンの場合、必要なのは何にも結び付けられないプロセスです。少なくとも、それはそれ自身のセッションにあり、端末にアタッチされず、親から継承されたファイル記述子を何も開かないようにし、親が(init以外の)あなたの世話をしないようにしますディレクトリを/アンマウントを妨げないように...

ターミナルからデタッチするには、新しいセッションを作成しますが、セッションを作成するには、グループ(またはセッション)リーダーであってはなりません。新しいプロセスをフォークするのが最善です。親が終了すると仮定すると、それはプロセスがもう親を持たず、initによって採用されることを意味します。次に、可能なファイル記述子をすべて閉じますchdir("/")(現在の作業ディレクトリを閉じて、ファイル記述子のようにそのリソースを解放すること/はできません。少なくとも現在の作業ディレクトリを作成しても、ディレクトリのアンマウントは妨げられません)。

そのプロセスはセッションリーダーであるため、端末デバイスを開くと、その端末の制御プロセスになるリスクがあります。もう一度フォークすると、それが起こらないことが保証されます。

一方、&では、インタラクティブシェルでは(端末のフォアグラウンドプロセスグループに含まれないように)新しいプロセスグループをフォークして作成し、非インタラクティブシェルではプロセスをフォークしてSIGINTを無視します。ターミナルからデタッチせず、ファイル記述子を閉じません(ただし、一部のシェルはstdinを再度開き/dev/nullます)...


chdir( "/")の用途は何ですか?ファイル記述子を閉じるには?
ティモシーレオン

@TimothyLeung、編集を参照してください。
ステファンシャゼル

8

プログラム/プロセスをデーモンとして実行することと、アンパサンドを使用してバックグラウンドでフォークすることの違いは、基本的に所有権に関連しています。

ほとんどの場合、デーモンの親プロセスはinitプロセス(Unixシステムで開始される最初のプロセス)であり、デーモンはそのプロセスの子であるため、非特権ユーザーとして直接制御されません。 。一方、プログラム/プロセスをバックグラウンドにフォークすると、いつでもフォアグラウンドにコールバックしたり、強制終了したりできます。


1
また、プロセスを
デタッチ

7

command &あなたのプロセスがSIGHUP信号によって殺される親が死ぬとき。

ただし、システム管理者はいくつかの回避策にアクセスできます。

bashシステムでは、次を使用できます。

(trap '' HUP; command) &

これはサブシェルを開き、HUP空のハンドラーでシグナルをトラップし、アンパサンド/フォークします。

出力は依然として間違った場所にリダイレクトされる可能性がありますtty。または迷子になります。
あなたが解決するかもしれないと&>command.out1>output.outまたは2>errors.out

ほとんどのシステムでは、nohupコマンドにアクセスすることもできます。
nohupこのプロセスを大幅に簡素化します。これはかなり標準的なものですが、多くのbusybox組み込みARMディストリビューションに欠けていることがわかりました。あなたはただ書く:

nohup command &

..これで完了です。出力はIIRCにリダイレクトされnohup.outますが、このファイル名はオプションで変更できます。


2
ZSHを使用すると、command &後でシェルから切り離すことができ、それがポストノーフとして機能することに注意してくださいdisown
数学
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.