javascript - node.js 产生。退出事件立即触发

标签 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 命令的本质作用是启动网络服务器。退出回调中的code为1,signal为null

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

更新:

如果我使用 exec,那么它工作正常!但是,如果我调用kill,进程不会死!

所以

 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(来自 Node 子进程和操作系统)不一样??

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

更新 2:

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

来自 Node :

enter image description here

来自操作系统:

enter image description here

所以 3752 是我想要终止的实际命令。我想我没有办法从 Node 获取这个 pid? :)

最佳答案

您的 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。

关于javascript - node.js 产生。退出事件立即触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22750397/

相关文章:

node.js - Google OAuth 使用刷新 token 获取新的访问 token

javascript - 为 Express-Validator 自动生成的错误消息

javascript - 从终端运行 npm 时为 "module.js:557 throw err"

javascript - 使用 dojo 将 css 样式应用于具有相同 css 类的多个节点

javascript - 如何在 meteor 中监听整个页面的点击事件?

javascript - 刷新后拖动时带有输入值的 jQuery slider

node.js - 如何在 MongoDB 中找到嵌套在数组深处的对象?

node.js - 如何在 win32-api Node 模块中使用带有 EnumWindows 的自定义结构

javascript - jquery.click(调用方法)

javascript - ExtJS 5 : Setting initialized config variables won't stick after setting from controller