使用node.js获取正在运行的进程'stdin / stdout

时间:2011-11-17 12:24:54

标签: node.js process stdio

我从具有child_process.spawn的节点开始一个进程并处理process.stdout / stderr数据事件,并写入stdin。

现在,我的节点应用程序可能崩溃或停止,当它重新启动时,我通过它的PID找到进程,然后我想再次附加到进程'stdin / stderr / stdout。

有问题的过程可能是任何类似守护进程的程序,因此我无法控制它的行为(例如,我无法设置过程在接收到信号时重定向它的stdio。)

我在考虑使用screen包装进程,将stdio重定向到FIFO文件(但是在节点6中不推荐使用customFds选项),但这些都不像process.stdin.on那样干净......

1 个答案:

答案 0 :(得分:0)

可能有一种更简单的方法,使用fuser我在这里创建了一个情境,其中node.js已经产生了一个进程而死了

xxx@ubuntu:~/node$ node index.js 
Server has started
Request for / received.
About to route a request for /
Request handler 'start' was called

/home/xxx/node/requestHandlers.js:27
response.write(body);
            ^
ReferenceError: body is not defined
at Object.start (/home/xxx/node/requestHandlers.js:27:17)
at route (/home/xxx/node/node/router.js:4:18)
at Server.onRequest (/home/xxx/node/node/server.js:9:3)
at Server.emit (events.js:70:17)
at HTTPParser.onIncoming (http.js:1478:12)
at HTTPParser.onHeadersComplete (http.js:102:31)
at Socket.ondata (http.js:1374:22)
at TCP.onread (net.js:348:27)

如果我运行fuser <directory from which node started - 示例fuser /opt/node,我会看到我创建的pids

xxxx@ubuntu:~$ fuser node
node:                16490c 16491

为了确保双倍 - 运行ps,我可以看到匹配的pid

xxxx@ubuntu:~$ ps -ef | grep find | grep -v grep
xxxx     16490     1  0 17:39 pts/0    00:00:00 /bin/sh -c find / -name 'moo'    
xxxx     16491 16490 21 17:39 pts/0    00:00:04 find / -name moo

我可以运行fuser -k /opt/node来杀死并清理从/opt/node开始的pid。我个人经常在工作和家中使用fuser来清理任何剩余的流程。

我在ubuntu和solaris上测试了fuser

注意:您唯一需要注意的是,如果该目录上有一个SSH会话,它将与从该目录启动的任何其他进程一起被激活。