标签: child-process

nodejs exec命令失败,没有有用的错误消息

这是要执行的代码



    cp.exec("cc -Wall /tmp/test.c -o /tmp/test", function(e, stdout, stderr) {
        if (e) {
            var errorstr = "Compilation failed with the following error
"+ e.message.toString() client.send(errorstr) console.log(e, stdout, stderr) ee.prototype.removeAllListeners() } else if (stderr.length > 0) { client.send("Compilion finished with warnings\n"+ stderr + '\n') client.send('compiled') ee.prototype.emit('compiled') } else { client.send("Compilation successful") ee.prototype.emit('compiled') } })
Run Code Online (Sandbox Code Playgroud)

'client'是socket.io的回调参数的参数.'ee'是EventEmitter的一个实例

来了问题.在运行代码时,回调表明该命令不成功.console.log(e,stdout,stderr)是

{ [Error: Command failed: ] killed: false, code: false, signal: undefined } '' ''

/tmp/test.c是一个有效的C代码以及检查目录/ tmp,我发现test.c的是适当的和二进制"测试" 生成并在上壳运行,则适当地执行.所以我不明白为什么它会导致执行不成功.错误对象的信息也没有用.希望得到一些帮助/解释

javascript exec child-process node.js

11
推荐指数
1
解决办法
9340
查看次数

try-catch-finally块是否在node.js中同步?

我在节点程序中的子进程中运行了一些代码,如下所示:

try{
    var data = fs.readFileSync(urlPath, {"encoding":"utf8"});
} catch (err) {
    console.log("Error reading url file...");
    throw err;
} finally {
    console.log("File read!");
    var array = data.split("\n");

    console.log("Found " + array.length + " urls");
Run Code Online (Sandbox Code Playgroud)

此代码从另一个节点程序调用,需要等待此文件中的所有操作完成.不幸的是,在finally执行块下的任何代码之前,子进程正在退出代码0 .

这让我相信即使try-catch-finally是异步也是如此.那是对的吗?

asynchronous try-catch child-process node.js

11
推荐指数
1
解决办法
2万
查看次数

节点子进程生成stdout返回为null

我正在编写一个Yeoman生成器并使用child_process.spawn()(通过yeoman的spawnCommand() - 请参阅https://github.com/yeoman/generator/blob/master/lib/actions/spawn_command.js)

我的代码看起来像这样:

var list = this.spawnCommand('npm', ['list', 'sails'], {stdio: 'pipe'});
list.stdout.on('data', /* callback here that wants to consume the command's output */);
Run Code Online (Sandbox Code Playgroud)

我可以看到list.stdio存在,它有[0,1,2]关键.它们中的每一个都是null(或未定义).也就是说,记录_.keys(list).join()输出,,. list.stdout.on()给我一个例外,说明stdout是null.

我需要做的是检查是否安装了特定的软件包,并查看版本号是什么.但我后来还需要做其他解析CLI命令输出的东西(例如,git log输出),所以我需要一个通用的解决方案. .spawn()看起来像我想要的,但我见过的例子似乎表明stdout应该是一个有.on()方法的东西.例如,这里给出的那个:http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options它显示正在运行ls -lh /usr.

我错过了一些简单的事吗?我想知道我运行的命令是否完全没有输出,如果这意味着stdout将为null.如果是这种情况,那么我只需要识别可能没有输出的命令,并在尝试使用它之前检查以确保stdout不为null.

实际编辑,npm list命令的输出显示在命令行上,但在我用于诊断问题的日志语句之后(我在.spawnCommand()调用之后和调用之前放了.on().但我需要在我的访问中访问它代码 - 让它出现在命令行旁边就在这一点上(除了它让我知道进程成功运行了CLI命令).

command-line-interface child-process node.js

11
推荐指数
2
解决办法
4268
查看次数

隐藏子进程控制台窗口

当在windows(child_process.spawn)上的nodejs中生成一个新子节点时,它总是会打开一个空白控制台窗口,该窗口在子进程结束之前保持打开状态.

有办法避免这种情况吗?

即我们希望使用我们的应用程序作为后台服务forever.然而,它不是很背景,因为它一直打开和关闭空白的控制台窗口......

编辑:使子应用程序以"安静"模式运行不是一个选项,因为正在生成的部分进程是wmic.

javascript windows child-process node.js forever

11
推荐指数
1
解决办法
1945
查看次数

如何使Perl等待使用system()在后台启动的子进程?

我有一些Perl代码执行多个参数的shell脚本,为了简化,我只是假设我有这样的代码:

for $p (@a){
    system("/path/to/file.sh $p&");
}
Run Code Online (Sandbox Code Playgroud)

之后我想做更多的事情,但是我找不到等待所有子进程完成的方法,然后再继续.

将代码转换为使用fork()会很困难.是不是有更简单的方法?

linux perl wait child-process

10
推荐指数
3
解决办法
3万
查看次数

node.js child_process.spawn no stdout除非'inherit'

我正试图从(0.10.29)的spawned child_process中捕获标准输出node.js.

现在我只想尝试 ping

以下代码不打印(但ping)

var exec = require('child_process').exec;
var spawn = require('child_process').spawn;
var util = require('util')

var ping = spawn('ping', ['127.0.0.1'], {stdio: 'pipe'});

ping.stdout.on('data', function(data){
    util.print(data);
})

ping.stderr.on('data', function(data){
    util.print(data);
})
Run Code Online (Sandbox Code Playgroud)

如果我改变stdio: 'pipe'stdio: 'inherit'和摆脱的stdout/stderr,像这样的钩子:

var ping = spawn('ping', ['127.0.0.2'], {stdio: 'inherit'});

// ping.stdout.on('data', function(data){
//  util.print(data);
// })

// ping.stderr.on('data', function(data){
//  util.print(data);
// })
Run Code Online (Sandbox Code Playgroud)

我明白了

PING 127.0.0.2 (127.0.0.2): 56 data bytes
Request timeout for icmp_seq 0
Request …
Run Code Online (Sandbox Code Playgroud)

javascript stdout stderr child-process node.js

10
推荐指数
1
解决办法
2753
查看次数

child_process.exec/spawn使用npm install命令触发回调/关闭(通过Gulp/Shipit)

  • 我正在使用Shipit进行部署.
  • 在部署时,Shipit将当前的Git Sha检出到tmp目录,然后运行npm install后跟gulp build,然后继续部署.
  • 正如Gulp所做的那样,Shipit使用Orchestrator来完成它的任务流程.
  • Shipit拥有自己的CLI,因此我可以部署shipit development deploy.

以上所有事情都有效.我要做的是创建一个gulp deploy将直接初始化Shipit 的任务,而不是使用CLI.看起来像这样:

gulp.task('shipit:deploy', function() {
  var deployToEnv = argv['deploy-to'] || false;
  var shipit;
  return inquirer.prompt([{
    type: 'list',
    name: 'deployToEnv',
    default: deployToEnv,
    message: 'Deploy to environment:',
    choices: envs
  }]).then(function(answers) {
    deployToEnv = answers.deployToEnv;
    shipit = new Shipit({environment: deployToEnv});
    shipit.initialize();
    shipit.start('deploy');
  });
});
Run Code Online (Sandbox Code Playgroud)

对应的shipit配置:

  shipit.initConfig(config);
  shipit.blTask('build', function() {
    return shipit.local('npm install --silent', {
      cwd: shipit.config.workspace
    }).then(function() {
      return shipit.local('gulp build', {
        cwd: …
Run Code Online (Sandbox Code Playgroud)

child-process node.js promise gulp

10
推荐指数
1
解决办法
1058
查看次数

如何在Visual Studio代码中调试子Node.JS进程?

如何在VS Code中调试子Node.JS进程?
以下是我正在尝试调试的代码示例:

var spawn = require('child_process').spawn;
var scriptPath = './child-script.js';
var runner_ = spawn('node', [scriptPath]);
Run Code Online (Sandbox Code Playgroud)

debugging child-process node.js visual-studio-code

10
推荐指数
2
解决办法
5526
查看次数

节点子进程事件侦听

我使用节点child_process API

https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

var child = child_process.spawn(cmd, val, options);
Run Code Online (Sandbox Code Playgroud)

从孩子我使用以下

child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
Run Code Online (Sandbox Code Playgroud)

我可以在这些管道事件里面添加一些代码如console.log吗?

例如,可能与原型

child.on('error', function(err) {
        console.log(err);
    });
Run Code Online (Sandbox Code Playgroud)

更新

我需要的是听听这个childProcess.stderr.pipe(process.stderr);,以防我得到错误process.exit(1)

当我尝试像我得到错误的东西

    child.stderr.pipe(function () {
            console.log("im here");
            process.stderr;
            process.exit(1);
        }
    );
Run Code Online (Sandbox Code Playgroud)

UPDATE2

我尝试以下方法

var child = child_process.spawn(cmd, value, opt);

child.stdout.on('data', function (data) {
    console.log("IM HERE");
    console.log('data' + data);
});
child.stderr.on('data', function (data) {
    console.log("IM HERE");
    console.log('test: ' + data);
    reject(data);
});
child.on('close', function (code) {
    console.log("IM HERE");
    console.log("close");
});
child.on('error', function (err) {
    console.log("IM HERE");
    console.log(err);
}); …
Run Code Online (Sandbox Code Playgroud)

javascript javascript-events spawn child-process node.js

10
推荐指数
2
解决办法
3206
查看次数

节点/子进程抛出E2BIG

我有一个相当简单的C++程序,它只接受一个Base64编码字符串的参数.我可以打电话给这个节目

我现在尝试使用node的child_process.spawn()调用此程序,但是当我传入相同的Base64字符串时它会抛出"E2BIG"错误.

我正在测试的Base64字符串长度为305016字节.

getconf ARG_MAX在我的Linux机器上运行返回2097152

任何想法为什么child_process抛出错误?

javascript linux child-process node.js

10
推荐指数
1
解决办法
2443
查看次数