2014-01-24 17 views
2

我構建了一個node.js應用程序,並將其打包爲二進制文件(使用nexe),並且想要在更新可用時更新並重新啓動進程。當我產生新的進程並退出時,我希望新的進程接管終端,但這不會發生。下面是我在(使用child_process)這樣做:在終端上如何用生成的孩子替換node.js進程?

var spawn = require('child_process').spawn; 
var child = spawn(process.execPath, process.argv, { 
    cwd: process.cwd(), 
    env: process.env, 
    detached: true, 
    stdio: 'inherit' 
}); 
child.unref(); 
process.exit(); 

子進程打印所有的控制檯日誌,但進入後臺。我哪裏錯了?我正在使用OS X Mavericks。

回答

4

你可以做這樣的事情:

當你啓動應用程序,通過另一個腳本啓動它。這會產生子進程並根據需要殺死它。

mother.js

var child; 
var spawn = require('child_process').spawn; 
var argv = process.argv; 
argv.shift(); 
argv.shift(); 

function startChild(){ 
    console.log("STARTING", process.execPath, "child.js", argv); 
    child = spawn(process.execPath, ["child.js", argv], { 
    cwd: process.cwd(), 
    env: process.env, 
    detached: true 
    }); 
    child.on('error', function(e){console.log(e)}); 
    child.stdout.pipe(process.stdout); 
    console.log("STARTED with PID:", child.pid); 
} 


process.on('SIGQUIT', function() { 
    child.kill(); 
    startChild(); 
}); 
startChild(); 

child.js

(function(){ 
    console.log("Started child process"); 
    setInterval(function(){console.log("running")}, 1000); 
})(); 

然後,您可以發送CTRL + C殺的事情。要重新加載發送ctrl + \或從你的更新函數調用mother.js。