nodejs 怎样检测子进程执行完成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs 怎样检测子进程执行完成相关的知识,希望对你有一定的参考价值。

参考技术A  nodejs是一种单线程模型,但是,使用nodejs的child_process模块可以实现多进程任务。利用child_process可以创建子进程,实现子进程和主进程之间的通信。
  nodejs v0.12.7版本child_process提供以下同步和异步的方式创建进程:
  异步创建:
child_process.spawn(command[, args][, options])
options.stdio
options.detached
options.customFds
child_process.exec(command[, options], callback)
child_process.execFile(file[, args][, options][callback])
child_process.fork(modulePath[, args][, options])
同步创建:
child_process.spawnSync(command[, args][, options])
child_process.execFileSync(command[, args][, options])
child_process.execSync(command[, options])本回答被提问者采纳

如何将视频文件作为输入传递给 NodeJS 中的子进程并接收帧/图像作为输出?

【中文标题】如何将视频文件作为输入传递给 NodeJS 中的子进程并接收帧/图像作为输出?【英文标题】:How to pass a video file as input to a child process in NodeJS and receive frames/images as output? 【发布时间】:2016-10-16 19:23:57 【问题描述】:

我在 OpenCV C++ 中编写了一个代码,该代码从命令行获取视频和时间戳(采用 HH:MM:SS 格式)作为输入,并检测该帧中的人脸。检测到的人脸被裁剪并写入 PNG 文件。

$ ./executable video.mp4 00:00:01

现在我想在 NodeJS 中为 executable 构建一个 Web API。我使用了child_process.spawn 和命令行参数。该应用程序运行没有任何错误,但我没有得到裁剪的图像作为输出。看来我的应用程序要么无法将输入视频传递给executable,要么无法从中读取输出。这是我的第一个 NodeJS 应用程序。这是我的代码。

/**
* app.js
* make sure to install express (npm install express)
* and place the executable beside this file
* or set executablePath to the correct path.
* run the app and open 'http://0.0.0.0:3000' in your browser.
*/

var child_process = require('child_process');
var path = require('path');
var express = require('express');
var app = express();

var executable = null;

app.get('/', function (req, res) 

const args = process.argv;
console.log(args);
//console.log(process.argv[3]);

if (process.argv.length <= 3) 
console.log("Usage: nodemon " + __filename + " <path/to/video> <HH:MM:SS>");
process.exit(-1);


if (executable !== null) 
  res.end('executable is already running.');
  return;


var executablePath = path.join(__dirname, './executable');
executable = child_process.spawn(executablePath, [process.argv[2], process.argv[3]]);

executable.on('exit', function (signal, code) 
console.log('executable exited with signal: %s and code: %d', signal, code);
executable = null;
);

res.end('Done.');
);

app.listen(3000);
console.log('Listening on port 3000');

我正在运行它

$ nodemon app.js video.mp4 00:00:01

我还需要知道如何从 API 本身传递参数 video.mp400:00:01

【问题讨论】:

【参考方案1】:

我自己想出了解决方案。我需要在生成子进程时添加stdio: 'inherit' 选项。这是最终代码:

/**
* app.js
* make sure to install express (npm install express)
* and place the executable beside this file
* or set executablePath to the correct path.
* run the app and open 'localhost:3000/?vid=<path to video file>&tstamp=<timestamp in HH:MM:SS format>' in your browser.
*/

var child_process = require('child_process');
var path = require('path');
var express = require('express');
var app = express();
var fs = require('fs');

var executable = null;

app.get('/', function (req, res) 

if (executable !== null) 
res.end('executable is already running.');
return;


var video = req.param('vid');
var timestamp = req.param('tstamp');

var executablePath = path.join(__dirname, './executable2');

executable = child_process.spawn(executablePath, [video, timestamp], stdio: 'inherit');

executable.on('exit', function (signal, code) 
console.log('executable exited with signal: %s and code: %d', signal, code);
executable = null;
);

res.end('Done.');
);

app.listen(3000);
console.log('Listening on port 3000');

之后,运行应用程序

$ nodemon app.js

并在浏览器中打开以下链接

localhost:3000/?vid=<path to video file>&tstamp=<timestamp in HH:MM:SS format>

它从url本身获取视频文件和时间戳,运行应用时无需从终端提供这些参数。

【讨论】:

以上是关于nodejs 怎样检测子进程执行完成的主要内容,如果未能解决你的问题,请参考以下文章

如何将视频文件作为输入传递给 NodeJS 中的子进程并接收帧/图像作为输出?

如何从nodejs刷新子进程

linux下system函数调用shell命令后,怎样让主进程等子进程返回后,接着执行

如何在 nodejs 中侦听和生成多个子进程

详解node多进程child_process用法及原理

nodejs中的子进程,深入解析child_process模块和cluster模块