2016-07-25 13 views
0

逆のシェルの例でdaemonize()と呼ばれるこの方法を見つけたとき、私はGitHubを見ていました。 sourceこのデーモン化メソッドは何をしますか?

私はかなり理解していないこと、それはこの文脈で何をするかであるようなコマンドラインから、このコードを実行していないでしょう:python example.py &は、同じことを達成していませんか?

Deamonize方法ソース:

def daemonize(): 
    pid = os.fork() 
    if pid > 0: 
     sys.exit(0) # Exit first parent 
    pid = os.fork() 
    if pid > 0: 
     sys.exit(0) # Exit second parent 
+1

[デーモンとしてプログラムを実行し、 '&'を使用してプログラムをバックグラウンドでフォークするのとは何ですか?](http://unix.stackexchange.com/questions/56495/whats-the-difference-between-running -a-a-a-daemon-and-forking-it-into) –

答えて

1

&シグナルを使用しているpython2.7 <file>.pyのバックグラウンドプロセスは、真のデーモンプロセスと同じではありません。

真のデーモンプロセス:バックグラウンドで

  • 実行します。これは、&を使用して類似性が終了する場合にも発生します。
  • 端末と同じプロセスグループ内にありません。端末が閉じると、デーモンも死ぬことはありません。これは&では起こりません。プロセスは同じままです。単純にバックグラウンドに移動されます。
  • すべての継承されたファイル記述子(入力、出力などを含む)を正しく閉じて、何も親に戻さないようにします。繰り返しますが、これは&では発生しません。端末にはまだ書き込まれます。
  • SIGHUPではなく、SIGKILLで殺すのが理想です。 &で実行すると、SIGHUPによってプロセスが強制終了されます。

このすべては、しかし、衒学です。これらのプロパティが必要とする極端な作業はほとんどありません。新しい端末で起動されるバックグラウンドタスクは、通常は同じジョブを実行することができますが、それほど効率的ではありません。長時間実行されるバックグラウンドタスク。 との間の唯一の実際の違いと真のデーモンは、潜在的な死のすべての道を避けようとしているだけです。

あなたが見たコードは、現在のプロセスをフォークするだけです。基本的に、現在のプロセスをクローンし、親プロセスを強制終了し、現在の実行をブロックしない別個のプロセスでバックグラウンドで動作します。あなたが私に尋ねれば、醜いハックです。

1

Orphan ProcessesDaemon Processを見てください。親を持たないプロセスはinitの子になります(pid 1)。

プロセスのグループをシャットダウンする時間が来たとき、例えば、bashインスタンスのすべての子どもたちは、OSはそのbashの子どもたちに一息を与えるようになります。孤児は、この場合のように強制されるか、または何らかの事故のために他の人がその治療を受けず、より長く滞在します。

関連する問題