2017-12-19 7 views
2

のNode.js 8.9.1、Linux版、私は子供と終了を開始するために、親が必要4.10.0-42ジェネリック分離した子を実行した後に親プロセスが自動的に終了しないのはなぜですか?

const { fork } = require('child_process'); 

const forked = fork('child.js', { 
    detached: true, 
    stdio: 'ignore' 
}); 

const config = { 
    name: 'trex', 
    interval: 2000 
}; 

forked.send(config); 
forked.unref(); 

for (let i = 0; i < 3; i++) { 
    console.log('do staff'); 
} 

子供

const work = function() { 
    let sum = 0; 
    for (let i = 0; i < 1e10; i++) { 
    sum += i; 
    } 
}; 

const start = function(config) { 
    setTimeout(function run() { 
    work(); 
    setTimeout(run, config.interval); 
    }, config.interval); 
}; 

process.on('message', function(config) { 
    start(config); 
}); 

通常は。今私がnode parent.jsを実行すると、私はまだ親が走っているのを見る。

[email protected]:~/dev/$ ps aux | grep -e "parent\|child" | grep node 
trex  5134 0.0 0.1 874016 29460 pts/11 Sl+ 10:44 0:00 node parent.js 
trex  5140 86.3 0.1 874108 30252 ?  Rsl 10:44 4:59 /home/trex/.nvm/versions/node/v8.9.1/bin/node child.js 

私には、process.exit()があります。しかし、なぜそれが正常に終了しないのですか?私のアプリの親はsetTimeoutループ内にあり、多くのロジックがあり、時間の間隔で1回だけ実行する必要があります。

+0

使用 'forked.unref()'、あなたの 'forked.send後の()' – Keith

+0

@Keithが、それにもかかわらず、親がまだ実行されて、試してみました。 – trex

+0

Windowsのところで試してみましたが、まだ動作しているように見えますが、あなたはまだデタッチされています:true?..もしstdioが参照されている場合は、stdio: 'ignore'を試してみてください。 – Keith

答えて

2

​​からドキュメント:で追加

subprocess.disconnect()#:v0.7.2を保つ他の接続がない たら子供が正常に終了することができ、親と子の間のIPCチャネル を閉じますそれは生きている。この メソッドを呼び出すと、 のsubprocess.connectedおよびprocess.connectedプロパティはそれぞれ親と子の両方がfalseに設定され、 はプロセス間でメッセージを渡すことができなくなります。

受信中のメッセージがない場合、 'disconnect'イベントが発生します。これは、ほとんどの場合、subprocess.disconnect()を呼び出した直後に がトリガーされます。子プロセスがNode.jsのインスタンスである場合(例えば)(child_process.forkを用い を生み出し)こと

注、process.disconnect()メソッドは、同様にIPCチャネルを閉じるために、子プロセス内 を呼び出すことができ。

const work = function() { 
    let sum = 0; 
    for (let i = 0; i < 1e10; i++) { 
    sum += i; 
    } 
}; 

const start = function(config) { 
    setTimeout(function run() { 
    work(); 
    setTimeout(run, config.interval); 
    }, config.interval); 
}; 

process.on('message', function(config) { 
    start(config); 
    process.disconnect(); 
}); 
関連する問題