node.js spawn。退出事件直接开除

时间:2014-03-30 21:55:50

标签: javascript node.js

我正在使用mjpg_streamer的spawn函数。但是,子进程只是在创建后立即退出。这是我正在使用的代码

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;
});

运行实际命令本身会返回以下内容:

enter image description here

mjpg_streamer命令基本上做的是启动网络服务器。退出回调中的代码为1,信号为null

不太确定发生了什么......

更新

如果我使用exec,那么它运行正常!但是,如果我叫杀,这个过程不会死!

所以

 streamingProcess = exec('LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -w /usr/local/www"');

确实启动了网络服务器,但现在如果我打电话

 streamingProcess.kill()

退出事件被触发,但进程本身不会死亡。在进一步检查时,似乎pid(来自节点子进程和os)是不一样的?

现在我很困惑......

更新2:

好的,我想我开始明白exec发生了什么。所以它在子shell中执行命令,这对我来说是创建两个进程。一个是子shell,另一个是mjpg_streamer命令本身。因此,杀死exec只能杀死子shell。但是mjpg_streamer仍然存在。

来自节点:

enter image description here

来自os:

enter image description here

所以3752是我要杀的实际命令。我想我无法从节点获取这个pid? :)

1 个答案:

答案 0 :(得分:2)

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

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问题是Node获取shell的pid,它启动命令而不是命令本身的pid。 (这也解释了为什么,就像在命令行中键入命令一样,exec需要双引号来防止参数被分割。)

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