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。