Tag: subprocess

ChildProcessclosures,退出事件之间的区别

当通过Node.js中的spawn()/exec()/…产生subprocess时,subprocess有一个'close'和'exit'事件。 这两者之间有什么区别,什么时候需要使用什么?

如果脚本被杀死,node.js产生的进程将继续存在

是否有可能确保生成的进程node.js child_process将被杀害父时杀害? 这是一个示例脚本 var spawn = require('child_process').spawn; var log_tail = spawn("tail", ["-f", "/dev/null"]); setInterval(function() { console.log('just chilling'); }, 10000); 如果我看看进程树,我看到这个: $ ps faux ubuntu 9788 0.0 0.0 73352 1840 ? S 15:04 0:00 | \_ sshd: ubuntu@pts/7 ubuntu 9789 0.0 0.2 25400 6804 pts/7 Ss 15:04 0:00 | \_ -bash ubuntu 10149 1.0 0.2 655636 […]

Node.js child_process exec的标准输出被缩短

在Node.js中,我使用了child_process模块​​的exec命令来调用Java中的一个algorithm,该algorithm返回大量的文本,然后parsing和使用。 我能够捕捉它,但是当它超过一定数量的行,内容被截断。 exec("sh target/bin/solver "+fields.dimx+" "+fields.dimy, function(error, stdout, stderr){ //do stuff with stdout } 我已经尝试过使用setTimeouts和callback,但没有成功,但我确实感到这是因为我引用标准输出之前,它可以完全检索我的代码。 我已经testing过,stdout实际上是数据丢失首先发生的地方。 这不是一个asynchronous的问题。 我也在我的本地机器和Heroku上testing过,并且发生完全相同的问题,每次都在同一行号码处截断。 任何想法或build议可能有助于这个?

如何等待subprocess在Node.js中完成?

我正在通过Node.js中的subprocess运行Python脚本,如下所示: require('child_process').exec('python celulas.py', function (error, stdout, stderr) { child.stdout.pipe(process.stdout); }); 但是Node不会等待它完成。 我该如何等待这个过程呢? 编辑:是否有可能通过在我从主脚本调用的模块中运行subprocess来做到这一点?

Node.js – 发送一个大对象到child_process很慢

我的用例如下:我从节点服务器向公共API进行大量的API调用。 有时反应很大,有时很小。 我的用例要求我将响应JSON串联起来。 我知道一个大的JSON作为响应将阻止我的事件循环。 经过一番研究,我决定使用child_process.forkparsing这些响应,以便其他API调用不需要等待。 我尝试从我的主进程发送一个30 MB的JSON文件到分叉的child_process。 subprocess需要很长的时间来挑选和parsingjson。 从孩子的过程中期待的回应并不是很大。 我只是想串并获得长度,并发回到主stream程。 我附上主和子代码。 var moment = require('moment'); var fs = require('fs'); var process = require('child_process'); var request = require('request'); var start_time = moment.utc().valueOf(); request({url: 'http://localhost:9009/bigjson'}, function (err, resp, body) { if (!err && resp.statusCode == 200) { console.log('Body Length : ' + body.length); var ls = process.fork("response_handler.js", […]

在nodejs(windows)中显示正在运行的subprocess的输出

比如说,我使用下面的代码(名为server.js)运行节点(我正在使用windows)中最基本的webServer: var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/'); 我想把它作为一个subprocess运行,并成功地完成了以下任务: var exec = require('child_process').exec; var serv = exec('node server.js', function(error, stdout, stderr){ console.log('outputs & errors:' + error, stdout, stderr); }); 但是,一旦我运行第二个文件,我什么也没有收到。 没有“输出和错误”,没有“服务器运行在…”。 如果我在浏览器中inputlocalhost:1337,我会得到“hello world”,所以我知道它正在运行。 有没有办法pipe这个“服务器运行…”,所以我可以“确定”它正在监听?

写入产生的进程stdin nodejs?

我有一个脚本,我想从另一个运行。 问题在于子脚本(进程)在继续之前需要用户input。 var child = spawn('script'); child.stdin.setEncoding('utf8'); child.stdout.on('data', function (data) { console.log(data.toString().trim()); // tells me to input my data child.stdin.write('my data\n'); }); input我的数据后,子脚本应该继续,而是挂在那里。 解 其实上面的代码适合我。 我在子脚本中使用commander.js来提示用户采取行动。 以下是我如何回应小孩的脚本提示: child.stdout.on('data', function (data) { switch (data.toString().trim()) { case 'Username:': child.stdin.write('user'); break; case 'Password:': child.stdin.write('pass'); break; } }); 同样的事情与假设 : var suppose = require('suppose'); suppose('script') .on('Username: ').respond('user') .on('Password: ').respond('pass') […]

Nodejs – 进程在退出时挂起(Ctrl + C)

我有一个node.js项目,它做许多事情,它产生subprocess,它打开一个http和socket.io服务器等。 当我从控制台运行它,用Ctrl+Cclosures它,它只是挂起。 从webstorm中,停止这个过程是一个两步的过程,首先我停下来,然后我需要再次点击button,只有第二次button是一个骷髅图标。 现在,我知道这样会留下一些开放或悬挂的东西,但我无法弄清楚什么,我试图追踪所有开始进程的地方,并确保我正确地杀死它们。 有没有一种方法来debugging,并找出是什么让我的过程挂起? 难道它是日志logging,打开一个写入stream,永远不会closures? 我甚至不知道什么样的事情会使信号在SIGINT上挂起。 编辑:我已经下载pstree ,看看是否有任何的主进程生成的subprocess保持活着。 看起来他们都正常终止 – 主节点进程是唯一剩下的。

nodejs中的event.on()和event.once()之间的差异

我正在testingplus_one应用程序,并在运行时,我只是想澄清我的概念event.once()和event.on() 这是plus_one.js > process.stdin.resume(); process.stdin.on('data',function(data){ var number; try{ number=parseInt(data.toString(),10); number+=1; process.stdout.write(number+"\n"); } catch(err){ process.stderr.write(err.message+"\n"); } }); 这是test_plus_one.js var spawn=require('child_process').spawn; var child=spawn('node',['plus_one.js']); setInterval(function(){ var number=Math.floor(Math.random()*10000); child.stdin.write(number+"\n"); child.stdout.on('data',function(data){ console.log('child replied to '+number+' with '+data); }); },1000); 当使用child.stdin.on()时,我得到了一些maxlistener偏移警告,但是当使用child.stdin.once()时,情况并非如此,为什么会发生这种情况呢? 是否因为child.stdin正在监听之前的input? 但是在这种情况下,maxlistener偏移量应该更频繁地设置,但是它只能在一分钟内发生一次或两次。

nodejs / express – streamstdout立即到客户端

我产生了下面的孩子: var spw = spawn('ping', ['-n','10', '127.0.0.1'])我想在客户端( 浏览器 ) 一个 ,而不是一个整体。 到目前为止,我试过这个: app.get('/path', function(req, res) { … spw.stdout.on('data', function (data) { var str = data.toString(); res.write(str + "\n"); }); … } 然后: … spw.stdout.pipe(res); … 在这两种情况下,浏览器等待10个ping完成,然后打印整个结果。 我想一个接一个,怎么做到的? (客户端正在调用…/path和console.logs结果) 编辑:虽然我确实认为,websockets是必要的,我只是想知道是否有任何其他的方式。 我看到了几个令人困惑的SO答案 ,博客post(在这篇文章中,在第一步OP把日志发送到浏览器),这没有帮助,所以我决定去寻求一些关注。