node.js产生。 退出事件立即开除

我正在用mjpg_streamer使用spawn函数。 但是,subprocess一旦创build就立即退出。 这是我正在使用的代码

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服务器。 退出callback中的代码是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"'); 

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

  streamingProcess.kill() 

退出事件被解雇,但进程本身不会死亡。 在进一步的检查看来,似乎(从节点subprocess和操作系统上)的PID是不一样的?

现在我很困惑…

更新2:

好吧,我想我已经开始理解exec是怎么回事了。 所以它在一个子shell中执行命令,这对我来说是创build两个进程。 一个是子shell,另一个是mjpg_streamer命令本身。 所以杀死exec只会杀死子shell。 但mjpg_streamer依然存在。

从节点:

在这里输入图像说明

从os:

在这里输入图像说明

所以3752是我想要杀死的实际命令。 我想没有办法让我从节点获得这个PID? 🙂

您的spawn调用执行命令,但命令失败(退出代码1)。 我相信这是由于在你传递的命令中出现了额外的引号。 在使用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。 (这也解释了为什么,就像在命令行input命令一样, exec需要双引号来防止参数被拆分。)

总结一下, spawn不使用shell,所以你不用引号来防止空白分裂,你得到的pid就是你的命令的pid。 但是, exec启动一个shell来执行这个命令,所以需要引号,并且你得到了shell的pid。