这与这个问题类似,但我想把它充实一点.(我是新来的,如果我应该在前一个问题上做一个"碰撞"的答案,请告诉我.)
在WinDBG中,我可以使用该.childdbg 1命令告诉它在生成子进程时中断,或者我可以使用-o命令行选项启动它.这在某些情况下非常有用,所以令人惊讶的是(据我所知)Visual Studio不支持它.似乎DEBUG_PROCESS_ONLY_THIS_PROCESS在CreateProcess()上清除标志应该很容易,VS已经支持调试多个进程.
那么,我在Visual Studio中缺少一些选项来启用它吗?如果没有,是否有技术理由说明为什么他们选择不支持它?
我打算使用supervisor运行多个进程,请在下面找到我的supervisord.conf文件:
[supervisord]
[program:bash]
command=xyz
stdout_logfile =/tmp/bash.log
redirect_stderr=true
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock
[unix_http_server]
file=/tmp/supervisor.sock ; path to your socket file
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
Run Code Online (Sandbox Code Playgroud)
我希望将名为bash的进程的stdout重定向到supervisor控制台,以便在我启动supervisor时使用
/usr/bin/supervisord
Run Code Online (Sandbox Code Playgroud)
命令,我可以看到子进程日志.我怎样才能做到这一点 ?我尝试将syslog用于stdout_logfile属性但它不起作用.
我是对应用程序执行spawn(子进程)的节点应用程序,应用程序有主机和端口:
var exec = require('child_process').spawn;
var child = exec('start app');
console.log("Child Proc ID " + child.pid)
child.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
child.stderr.on('data', function(data) {
console.log('stdout: ' + data);
});
child.on('close', function(code) {
console.log('closing code: ' + code);
});
Run Code Online (Sandbox Code Playgroud)
一些应用程序将立即启动,一些应用程序将需要一些时间10 - 20秒,直到它们启动.
现在我使用节点http代理来运行应用程序,问题是当用户想要在应用程序启动并运行之前运行应用程序时出现错误.知道我怎么能解决这个问题?
proxy.on('error', function (err, req, res) {
res.end('Cannot run app');
});
Run Code Online (Sandbox Code Playgroud)
顺便说一句,由于我们的框架限制,我无法在代理错误中发送响应500.任何其他想法我如何跟踪应用程序可能会有一些超时,以查看它发送响应的天气200.
更新 - 我的逻辑样本
httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({});
http.createServer(function (req, res) {
console.log("App proxy new port is: " + 5000) …Run Code Online (Sandbox Code Playgroud) 我正在测试plus_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");
}
});
Run Code Online (Sandbox Code Playgroud)
这是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);
Run Code Online (Sandbox Code Playgroud)
在使用child.stdin.on()时我得到的maxlistener偏移警告很少但是在使用child.stdin.once()时不是这种情况,为什么会发生这种情况?
是因为child.stdin正在听以前的输入吗?但是在这种情况下,maxlistener偏移量应该更频繁地设置,但它只会在一分钟内发生一次或两次.
通过spawn()/exec()/...Node.js生成子进程时,子进程上有'close'一个'exit'事件和一个事件.
这两者之间有什么区别,什么时候需要使用什么?
如何确保在父进程被终止时所有child_process被杀死.我有类似下面的东西.
即使节点进程被终止,我也看到FFMPEG继续运行并且生成了out.avi.如何在节点进程退出后停止运行FFMPEG.
var args = "ffmpeg -i in.avi out.avi"
child_process.exec(args , function(err, stdout,stderr){});
child_process.exec(args , function(err, stdout,stderr){});
Run Code Online (Sandbox Code Playgroud) 我有一个node.js项目做了很多事情,它产生子进程,它打开一个http和socket.io服务器等.
当我从控制台运行它时,关闭它Ctrl+C,它只是挂起.从webstorm开始,停止这个过程分为两个步骤,首先我点击停止,然后我需要再次点击按钮,只有第二次按钮是一个头骨图标.
现在,我明白它留下了一些开放或悬挂的东西,但我无法弄清楚是什么,我试图跟踪我开始一个过程的所有地方,并确保我正确地杀死它们.
有没有办法调试这个并找出是什么让我的进程挂起?可能是打开写入流并永远不会关闭的日志记录吗?我甚至不确定什么样的东西会使SIGINT上的进程挂起.
编辑:我已下载,pstree以查看主进程生成的任何子进程是否保持活动状态.看起来它们都正常终止 - 主节点进程是唯一剩下的.
放弃
我很清楚在这种情况下,对于套接字服务器来说,PHP可能不是最佳选择.请不要建议使用不同的语言/平台 - 相信我 - 我从各方面都听过.
在Unix环境中工作并使用PHP 5.2.17,我的情况如下 - 我在PHP中构建了一个与Flash客户端通信的套接字服务器.我的第一个问题是每个传入的连接都阻塞了顺序连接,直到它完成处理.我用PHP 来解决这个问题pcntl_fork().我成功地能够产生许多子进程(在父节点中保存它们),这些进程负责向其他客户端广播消息,因此"释放"父进程并允许它继续处理下一个连接[s].
我现在的主要问题是处理/处理这些死/僵尸子进程的集合并终止它们.我已经阅读(一遍又一遍)pcntl_fork()的相关PHP手册页,并意识到父进程负责清理其子进程.当子进程执行时,父进程从其子进程接收SIGNAL exit(0).我能够使用pcntl_signal()函数"捕获"该信号来设置信号处理程序.
我的signal_handler看起来像这样:
declare(ticks = 1);
function sig_handler($signo){
global $forks; // this is an array that holds all the child PID's
foreach($forks AS $key=>$childPid){
echo "has my child {$childPid} gone away?".PHP_EOL;
if (posix_kill($childPid, 9)){
echo "Child {$childPid} has tragically died!".PHP_EOL;
unset($forks[$key]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我确实看到两个echo都包括需要删除的相关且正确的子PID,但似乎是这样
posix_kill($childPid, 9)
Run Code Online (Sandbox Code Playgroud)
我理解为同义的kill -9 $childPid …
我催生了下面的孩子:var spw = spawn('ping', ['-n','10', '127.0.0.1'])我希望在客户端(浏览器)上逐个接收ping结果,而不是整体.
到目前为止我试过这个:
app.get('/path', function(req, res) {
...
spw.stdout.on('data', function (data) {
var str = data.toString();
res.write(str + "\n");
});
...
}
Run Code Online (Sandbox Code Playgroud)
然后:
...
spw.stdout.pipe(res);
...
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,浏览器等待10个ping完成,然后将结果作为一个整体打印出来.我想逐个拥有它们,如何实现这一目标?
(客户端只是调用.../path和console.logs结果)
编辑:虽然我确实认为websockets是实现这一点所必需的,但我只是想知道是否还有其他方法.我看到了几个令人困惑的SO答案,以及博客帖子(在这篇文章中,第一步OP将日志流式传输到浏览器中)没有帮助,因此我决定寻求一些值得关注的赏金.
child-process ×10
node.js ×6
php ×2
spawn ×2
concurrency ×1
debugging ×1
eventemitter ×1
express ×1
javascript ×1
linux ×1
sockets ×1
supervisord ×1
threadpool ×1