见下图。我从终端运行命令,启动进程A,启动服务器(进程B),然后服务器将启动工作程序(进程C)。我想将服务器的stdout / stderr流式传输到某个日志文件,但我希望工作者的stdout和stderr流回终端。这里的所有进程都是Node.js进程。
不知道如何做到这一点或者是否可能。我唯一猜测它是如何工作的,如果终端会话有某种句柄或id我可以使用并告诉工作进程流到该句柄或id。我不太了解* nix知道这是如何工作的。任何解释都会有所帮助。
这是一个视觉效果:
答案 0 :(得分:3)
使用Node.js(因为OP的所有进程都是Node.js进程),这是我发现的一个解决方案。
第1步,在进程A中,获取当前的tty标识 终端/ TTY
const tty = String(cp.execSync('tty', {stdio:['inherit','pipe','pipe']})).trim();
第2步,将tty值从流程A传递到流程B =>我通过了那个 使用socket.io的子进程的动态值(字符串)(你 也可以使用IPC)
this.emit('tty-value', tty);
第3步在子进程B中,我使用
fd = fs.openSync(tty)
来获取 正确的文件描述符。
const fd = fs.openSync(tty)
第4步然后我可以使用以下内容写入要写入的终端
const strm = fs.createWriteStream(null, {fd: fd});
因此,当进程B创建子进程C时,它可以进行将stdout / stderr从进程C传递到上述流所需的调用。
...这花了我一整天才弄明白,所以留在这里让任何人看到
答案 1 :(得分:0)
很好找出tty的东西。不确定是否有更简单的方法可以做到这一点,但我有一些想法在某种程度上欺骗你的问题,但从长远来看可能更好。
使用winston
或bunyan
等日志框架。或者像timequerylog
这样的结构化日志记录系统。日志记录框架将允许多个记录器,一个可以转到文件,另一个可以转到stdout。
使用Cluster内置节点模块创建工作人员,让工作人员使用事件/数据向主人发送消息。然后主人可以记录那些标准输出。