【问题标题】:Problems with monitoring processes launched by child_process spawn on Windows在 Windows 上由 child_process spawn 启动的监控进程的问题
【发布时间】:2015-09-15 19:59:56
【问题描述】:

我的目的只是使用 node.js 启动一个 exe。如果应用程序意外终止,则应捕获异常并将其记录在协议中。在 c++ 项目中通过以下语句引发异常:

throw std::string("NOT X or x!!!");

我的 Javascript 是:

var spawn = require('child_process').spawn;
var cp = spawn(process.env.comspec, ['/c', 'myExcepTest.exe', '', '']);

// **doesn't work**
cp.on('uncaughtException', function(err){
    console.log("Caught exception: " + err);
});
cp.stderr.on('error', function(err) {
    console.log(err.toString());
});
cp.stdin.resume();
cp.stdin.setEncoding('utf8');
cp.stdin.on('data', function(data) {
    cp.stdout.write(data);
});

// **does work**
cp.on('exit', function(code){
    console.log("Child exited with code: " + code);
});
cp.stdout.on('data', function(data) {
    console.log(data.toString());
});

我的问题是:

  1. 使用 node.js 监控进程是否是一个好习惯 视窗?

  2. 是否可以使用 node.js 捕获异常 视窗?

  3. 如何在 node.js 中正确地将标准输入通过管道传输到标准输出 脚本?

对不起我的英语不好;)

【问题讨论】:

    标签: c++ node.js windows exception performance-testing


    【解决方案1】:
    1. 取决于你为什么要监控我认为的过程。
    2. 子进程没有uncaughtException。原因是没有标准的方法来捕获这些东西,考虑到子进程可以是任何类型的程序。
    3. 你不能通过管道将子进程的stdin 传递给它自己的stdout,因为stdin is a Writable stream 是子进程的输入(不是它的输出),所以stdin 永远不会有data 事件。

    【讨论】:

    • 到“为什么要监控流程”:动机很简单。我只想尝试通过以下方式自动化我的应用程序的测试:启动 exe,记录其 cpu 和 ram 使用情况,以防异常终止进程并对异常文本和结束时间进行协议。
    • 嗯,通常当一个进程意外终止时,它会以非零状态码(或信号)退出。这两个你都可以签入子进程对象的close 事件。当然,任何stdout/stderr 输出都可用,但从常规程序输出中解析可能并不容易。
    猜你喜欢
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多