Tag: subprocess

在nodejs中将数据从子节点传递给父节点

我有一个nodejs父进程,启动另一个nodejssubprocess。 subprocess执行一些逻辑,然后将输出返回给父进程。 输出很大,我试图使用pipe道进行通信,正如在child.send()方法(它工作正常BTW)的文档中所build议的。 我希望有人build议如何正确build立这个沟通渠道。 我希望能够从父母发送数据到孩子,也能够发送数据从孩子到父母。 我已经开始了一些,但它是不完整的(只发送消息从父母到孩子),并引发错误。 父文件代码: var child_process = require('child_process'); var opts = { stdio: [process.stdin, process.stdout, process.stderr, 'pipe'] }; var child = child_process.spawn('node', ['./b.js'], opts); require('streamifier').createReadStream('test 2').pipe(child.stdio[3]); 子文件代码: var fs = require('fs'); // read from it var readable = fs.createReadStream(null, {fd: 3}); var chunks = []; readable.on('data', function(chunk) { chunks.push(chunk); }); readable.on('end', function() […]

如何在不使用阻塞stdio的情况下将大数据从/传输到node.js中的subprocess?

我在node.js中有一些(子)进程需要传输大量的数据。 当我阅读说明书时说,它们之间的stdio和ipc接口是阻塞的,所以这是不行的。 我正在研究使用文件描述符,但我找不到一种方法从他们stream(请参阅我的其他更具体的问题如何stream/从节点中的文件描述符? ) 我想我可能会使用一个networking套接字,但我担心有不必要的开销。 我也看到这个,但它不一样(并没有答案: 如何在Node.js中以非阻塞的方式将大量的数据从subprocess发送到父进程? )

node.js child_process.spawn没有标准输出,除非“inheritance”

我试图从node.js (0.10.29)捕获spawn child_process stdout。 现在我只是试着用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); }) 如果我改变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); […]

产生node.jssubprocess导致云代工中的僵尸进程

我有一个node.js应用程序,我想使用下面列出的代码产生subprocess。 当我在本地运行这个应用程序时,每个'ps'命令很好地触发closures和退出事件。 然而,在我们的云代工(pivotal.io)应用程序中,stdout.close被触发,但subprocess本身的“closures”和“退出”事件决不会发生。 此外,这些进程在内存中保持为僵尸进程(因此~500请求服务器死于E_SPAWN错误)。 所以似乎node.js进程句柄中的退出处理程序从不触发,导致subprocess的退出代码不被读取。 这可以涉及到容器监督,cgroups? 有没有人有这个解决scheme,或者至less遇到同样的问题? testing代码: var cp = require('child_process'); //..create express app app.get('/foo/', function(req, res, next) { var child = cp.spawn("ps",["aux"]); child.stderr.pipe(process.stderr); child.stdout.on('data', function(data) { console.log('data'); res.send("\n<br>OUT" + data.toString()); }); child.stdout.on('close', function() { console.log('close stdout'); res.send("\n<br>CLOSE STDOUT"); }); child.on('close', function() { console.log('close'); res.send("\n<br>CLOSE"); }); child.on('exit', function() { console.log('exit'); res.send("\n<br>EXIT"); }); }); app.listen(); […]

uglify在运行child_process.execFile后崩溃

编辑2 我“解决了”这个问题,但是我不想把它作为答案,它不能解释实际发生的事情。 在我使用的.NET resourceReader.exe的代码中 Console.OutputEncoding = System.Text.Encoding.UTF8; 将国际化的资源stdout到unicode的stdout 。 如果我重置编码在我的程序结束 Console.OutputEncoding = System.Text.Encoding.Default; 那么我在Node中没有任何错误。 如果我没有重置它,我会得到原始问题中描述的错误。 看来,.NET在某种程度上弄乱了cmd.exe上的一些输出编码设置,导致后续节点运行失败! 编辑 我缩小了由resourceReader.exe引起的错误。 这是一个.NET程序,它从.NET程序集中读取一些资源stream,并使用Console.WriteLine它们打印到stdout。 我将Console.OutputEncoding = System.Text.Encoding.UTF8添加到resourceReader.exe因为有些资源是非ASCII字母的,这就是导致崩溃的原因! 如果我把这条线取出来,任务不会崩溃,但资源显示为不可打印的ASCII字符! 另外,崩溃只发生,如果我真的打印非ASCII到sdtout。 如果我不打印它们,它不会出错。 原版的 我添加了一个步骤到我的Gruntfile使用child_process.execFile运行从外部程序读取一些数据,并在构build中使用它。 现在每当我运行我的构build,它第一次运行良好,但第二次崩溃! 这里是崩溃的输出(这是在uglify任务): File build/Scripts/NDB.contacts.min.js created: 16.85 kBevents.js:85 throw er; // Unhandled 'error' event ^ Error: This socket is closed. at WriteStream.Socket._writeGeneric (net.js:656:19) at WriteStream.Socket._write (net.js:709:8) at doWrite (_stream_writable.js:301:12) […]

child_process.exec / spawn使用npm install命令(通过Gulp / Shipit)触发callback/closures

我正在使用Shipit进行部署。 在部署时,Shipit将当前的Git Sha检查到一个tmp目录,然后运行npm install ,然后执行gulp build ,然后继续部署。 Shipit使用Orchestrator来完成任务stream程,就像Gulp一样。 Shipit有它自己的CLI,所以我可以使用shipit development deploy 。 上面的所有东西都起作 我想要做的是创build一个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'); }); }); […]

我怎样才能parsing一个string到适当的参数child_process.spawn?

我希望能够采取一个命令string,例如: some/script –option="Quoted Option" -d –another-option 'Quoted Argument' parsing成我可以发送给child_process.spawn : spawn("some/script", ["–option=\"Quoted Option\"", "-d", "–another-option", "Quoted Argument"]) 我发现的所有parsing库(例如minimist等)都是通过将其parsing为某种选项对象等来做太多的事情的 。我基本上想要Node的等价物来创buildprocess.argv 。 这看起来像是一个令人沮丧的漏洞,因为exec需要一个string,但是并不像spawn那样安全。 现在我正在用这个方法来解决这个问题: spawn("/bin/sh", ["-c", commandString]) 但是,我不希望这样强烈地绑定到UNIX(理想情况下它也可以在Windows上工作)。 HALP?

在Node.js上使用SSH

我试图在node.js中运行一个sshsubprocess并通过我的程序进行控制。 我的代码: var util = require('util'); var spawn = require('child_process').spawn; var ssh = spawn('ssh', ['cloudstudios.ch']); ssh.stdout.on('data', function (data) { console.log('stdout: ' + data); }); ssh.stderr.on('data', function (data) { console.log('stderr: ' + data); }); ssh.on('exit', function (code) { console.log('child process exited with code ' + code); }); 我可以在控制台input密码,但是之后我什么也做不了。 我得到以下控制台输出: stderr: Pseudo-terminal will not be allocated because […]

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

我有一些代码运行在一个节点程序中的subprocess ,如下所示: 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"); 这个代码是从另一个节点程序调用的,需要等到这个文件中的所有操作完成 。 不幸的是,在执行finally代码块之前的任何代码之前,subprocess正在以代码0退出。 这让我相信即使try-catch-finally也是asynchronous的。 那是对的吗?

在脱壳节点时保留输出颜色

我有一个小Grunt任务,通过节点popup,并运行“composer php安装”。 var done = this.async(); var exec = require('child_process').exec; var composer = exec( 'php bin/composer.phar install', function(error, stdout, stderr) { done(error===null); } ); composer.stdout.on( 'data', grunt.log.write ); 正如你所看到的,我将这个subprocess的stdout输出到grunt.log。 除了输出全部以我的默认控制台颜色显示之外,所有的输出都如预期般显示出色。 如果我直接运行“composer php安装”,我会突出显示,提高可读性。 由于我对节点,Grunt以及一般情况下的新手很陌生,因此我不确定系统的哪个部分颜色会丢失,甚至不知道如何高效地进行debugging。