Javascript node.js生成。退出事件立即启动

Javascript node.js生成。退出事件立即启动,javascript,node.js,Javascript,Node.js,我正在使用mjpg_拖缆的繁殖功能。但是,子进程一创建就退出。这是我正在使用的代码 streamingProcess = spawn('mjpg_streamer', [ '-i', '"/usr/local/lib/input_file.so -f ' + IMAGE_PATH + ' -n ' + IMAGE_NAME + '"', '-o', '"/usr/local/lib/output_http.so -w /usr/local/www"' ]); streaming

我正在使用mjpg_拖缆的繁殖功能。但是,子进程一创建就退出。这是我正在使用的代码

streamingProcess = spawn('mjpg_streamer', [
    '-i', '"/usr/local/lib/input_file.so -f ' + IMAGE_PATH + ' -n ' + IMAGE_NAME + '"',
    '-o', '"/usr/local/lib/output_http.so -w /usr/local/www"'
]);

streamingProcess.on('exit', function(code, signal) {
    console.log('streaming process has stopped. Code: ' + code + ', signal: ' + signal);
    streamingProcess = null;
});
运行实际命令本身将返回以下内容:

mjpg_streamer命令的基本功能是启动Web服务器。退出回调中的代码为1,信号为
null

不太清楚发生了什么

更新:

如果我使用
exec
,那么它可以正常工作!但是,如果我调用kill,这个过程不会死

所以

确实启动了Web服务器,但是现在如果我调用

 streamingProcess.kill()
退出事件被触发,但进程本身不会消亡。进一步检查后,似乎pid(来自节点子进程和操作系统)不一样

现在我很困惑

更新2:

好的,我想我开始了解
exec
的情况了。所以它在子shell中执行命令,对我来说,子shell创建了两个进程。一个是subshell,另一个是mjpg_拖缆命令本身。因此,杀死
exec
只会杀死子shell。但mjpg_拖缆仍然存在

从节点:

从操作系统:


所以3752是我想要杀的真正的指挥官。我想我无法从节点获取此pid:)

您的
spawn
调用执行命令,但命令失败(退出代码1)。我相信这是由于传递给spawn的命令中出现了额外的引号。使用shell时,必须使用双引号,这样shell就不会拆分包含空格的参数。使用“繁殖”时,不得使用它们。因此:

streamingProcess = spawn('mjpg_streamer', [
    '-i', '/usr/local/lib/input_file.so -f ' + IMAGE_PATH + ' -n ' + IMAGE_NAME,
    '-o', '/usr/local/lib/output_http.so -w /usr/local/www'
]);
我在上面的命令中删除的唯一内容是双引号

exec
的pid问题是节点获取启动命令的shell的pid,而不是命令本身的pid。(这也解释了为什么就像在命令行中键入命令一样,
exec
需要双引号来防止参数被拆分。)


总之,
spawn
不使用shell,因此您不使用引号来防止空格分割,并且您得到的pid就是命令的pid。但是,
exec
启动一个shell来执行命令,因此需要引号,您就可以得到shell的pid。

DUDE。非常感谢你!
streamingProcess = spawn('mjpg_streamer', [
    '-i', '/usr/local/lib/input_file.so -f ' + IMAGE_PATH + ' -n ' + IMAGE_NAME,
    '-o', '/usr/local/lib/output_http.so -w /usr/local/www'
]);