我正在使用 child_process.spawn 从 Node 开始一个进程并处理 process.stdout/stderr 数据事件,并写入标准输入。
现在,我的 Node 应用程序可能会崩溃或停止,当它重新启动时,我会通过它的 PID 找到进程,然后我想再次附加到进程的 stdin/stderr/stdout。
有问题的进程可以是任何类似守护进程的程序,所以我无法控制它的行为(例如,我无法设置进程在收到信号时重定向它的 stdio)。
我正在考虑使用屏幕包装进程,将 stdio 重定向到 FIFO 文件(但 customFds 选项在 Node 6 中已弃用),但没有一个看起来像 process.stdin.on 那样干净......
最佳答案
可能有更简单的方法,使用 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
, 我看到了我创建的 pid
xxxx@ubuntu:~$ fuser node
node: 16490c 16491
只是为了双重确定 - 运行 ps
, 我可以看到匹配的 pids
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
开始的 pids .我个人使用fuser
定期在工作场所和家里清理所有遗留的流程。
我测试了fuser
在 ubuntu 和 solaris 上。
注意:您唯一需要注意的是,如果该目录上存在 SSH session ,它将与从该目录启动的任何其他进程一起被破坏。
关于node.js - 使用 node.js 获取正在运行的进程的标准输入/标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8167039/