我从具有child_process.spawn的节点开始一个进程并处理process.stdout / stderr数据事件,并写入stdin。
现在,我的节点应用程序可能崩溃或停止,当它重新启动时,我通过它的PID找到进程,然后我想再次附加到进程'stdin / stderr / stdout。
有问题的过程可能是任何类似守护进程的程序,因此我无法控制它的行为(例如,我无法设置过程在接收到信号时重定向它的stdio。)
我在考虑使用screen包装进程,将stdio重定向到FIFO文件(但是在节点6中不推荐使用customFds选项),但这些都不像process.stdin.on那样干净......
答案 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会话,它将与从该目录启动的任何其他进程一起被激活。