这是要执行的代码
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的是适当的和二进制"测试" 被生成并在上壳运行,则适当地执行.所以我不明白为什么它会导致执行不成功.错误对象的信息也没有用.希望得到一些帮助/解释
我在节点程序中的子进程中运行了一些代码,如下所示:
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
是异步也是如此.那是对的吗?
我正在编写一个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命令).
当在windows(child_process.spawn
)上的nodejs中生成一个新子节点时,它总是会打开一个空白控制台窗口,该窗口在子进程结束之前保持打开状态.
有办法避免这种情况吗?
即我们希望使用我们的应用程序作为后台服务forever
.然而,它不是很背景,因为它一直打开和关闭空白的控制台窗口......
编辑:使子应用程序以"安静"模式运行不是一个选项,因为正在生成的部分进程是wmic
.
我有一些Perl代码执行多个参数的shell脚本,为了简化,我只是假设我有这样的代码:
for $p (@a){
system("/path/to/file.sh $p&");
}
Run Code Online (Sandbox Code Playgroud)
之后我想做更多的事情,但是我找不到等待所有子进程完成的方法,然后再继续.
将代码转换为使用fork()会很困难.是不是有更简单的方法?
我正试图从(0.10.29)的spawn
ed 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) npm install
后跟gulp build
,然后继续部署.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) 如何在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) 我使用节点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) 我有一个相当简单的C++程序,它只接受一个Base64编码字符串的参数.我可以打电话给这个节目
我现在尝试使用node的child_process.spawn()调用此程序,但是当我传入相同的Base64字符串时它会抛出"E2BIG"错误.
我正在测试的Base64字符串长度为305016字节.
getconf ARG_MAX
在我的Linux机器上运行返回2097152
任何想法为什么child_process抛出错误?