2017-03-05 6 views
0

から切り離されていない私は、以下の単純化されたスクリプトがあります。プロセスはnohupをと始めた親

Pythonのtest.pyを:

import subprocess, os 


def run_background_process(script_name): 
    with open(os.devnull, 'w') as FNULL: 
     background_process = subprocess.Popen(['nohup', '{}'.format(script_name)], stdout=FNULL 
        , stderr=FNULL 
        , stdin=FNULL) 

    return background_process 

while True: 
    run_background_process('test.sh') 
    time.sleep(500) 

のBashシェルスクリプトtest.sh

#!/bin/bash 

n=1 

echo ${n} 
sleep 30 

そしてps -ef結果は次のとおりです。

15536 16555 0 14:18 test.py 
15541 15536 0 14:18 test.sh 

私はなぜtest.shtest.pyから切り離されておらず、まだtest.pyの子ですか?

答えて

1

すべての子プロセスは、親プロセスが終了しない限り、元の親プロセスの子プロセスのままです。これが起こると、PID 1のプロセスは孤立した子の新しい親になります。

nohupを使用しても、その関係は解除されません。 (そのためには、子供はfork新しいプロセスを終了して終了する必要がありますが、これは別のトピックです)。最初の答えははいです。子供はまだ親の子です。

他の質問に直接答えることは難しいです。あなたの質問で「切り離された」という意味はあまりよく定義されていません。 Unix/Linuxでは、プロセスグループ(プロセスの集合)、ジョブ制御、端末とセッション(プロセスグループの集合)を制御するチュートリアルを確認することをお勧めします。

ユーティリティnohupの目的は、ログアウト時に開始されたプロセスが終了しないようにすることです。存在するシェルはクリーンアップを実行し、その制御下のすべてのプロセスにSIGHUPシグナルを送信します。さらに、使用中の端末装置(キーボード入力、画面出力)は、ログアウト中に閉じられる。 nohupは、SIGHUPが無視され、端末が使用されていないことを確認します。その結果、対応するプロセスはログアウト後に作業を続けることができます。

+0

私の主張は、親が殺されたときに子供が実行を継続することです。これは上のケースでは起こっていません。子に永遠のループを置くと、親が殺されたときにも終了します。 – CuriousGuy

+0

@CuriousGuyあなたはctrl-Cで親を殺していますか? – VPfB

+0

はい、今はこれが問題だとわかります...子供は親が正常に出る場合にのみ生きるでしょう、そうですか? – CuriousGuy

関連する問題