2016-09-15 298 views
0

我已经催生了一个子进程,下面是代码:如何为子进程产生孙子进程?

const spawn = require('child_process').spawn; 
const ls = spawn('ls', ['-lh', '/usr'], { detached: true }); 

ls.stdout.on('data', (data) => { 
    console.log(`stdout: ${data}`); 
    fs.writeFileSync('path-to-test.txt', 'stdout'); 
}); 

ls.stderr.on('data', (data) => { 
    console.log(`stderr: ${data}`); 
    fs.writeFileSync('path-to-test.txt', 'stderr'); 
}); 

ls.on('close', (code) => { 
    console.log(`child process exited with code ${code}`); 
}); 

随着选项detached: true,它将保持孩子进程中运行,即使父进程被杀死。

我的问题是:如何在这个子进程下运行孙子进程?因为在我的senario中,产生这个子进程后,父进程将被终止。所以我不能产生另一个进程,除了使用现有的子进程来产生孙子进程。

回答

0

首先,重要的是要注意,分离的选项只会在父系死于Windows系统之后使子代保持活动状态。在Unix系统中,孩子会默认保持活动状态。

为了产生“孙子过程”,child_program.js也必须产生子过程。试试这个例子看看。假设你有app.js其中包含以下内容:

const spawn = require('child_process').spawn; 

const child = spawn(process.argv[0], [__dirname + '/child_program.js'], { 
detached: true, 
stdio: 'ignore' 
}); 

child.unref(); 

然后想,child_program.js包含以下内容:

const spawn = require('child_process').spawn; 

const child = spawn(process.argv[0], [__dirname + '/grandchild_program.js'], { 
detached: true, 
stdio: 'ignore' 
}); 

child.unref(); 

最后,让我们说grandchild_program.js做到这一点:

var fs = require('fs'); 

fs.writeFileSync(__dirname + '/bob.txt', 'bob was here', 'utf-8'); 

创建这些文件,把它们放在同一个目录下,运行node app.js,然后你应该看到bob.txt显示在那个文件夹中我的目录。如果您有任何问题,请告诉我。我的问题是,如果你知道process.argv[0]给你什么,以及你为什么用这个论点产生新的子进程。

+0

我知道process.argv [0]的值来自命令行参数,但我很抱歉,我在那里输入了错误的代码,现在已经被修正。所以我只有一个带有子进程的文件'app.js'来运行一个简单的命令,然后它应该产生一个孙子进程来运行另一个简单的命令。而已。 –

+1

@ Ng2-Fun:你误解了子进程是什么。你不运行一个子进程来运行一个简单的命令。这个简单的命令是你的子进程。 – slebetman

+0

@slebetman - 感谢您纠正我。 –