捕获二级/三级流到终端/ TTY

时间:2016-11-14 21:25:05

标签: node.js unix terminal tty

见下图。我从终端运行命令,启动进程A,启动服务器(进程B),然后服务器将启动工作程序(进程C)。我想将服务器的stdout / stderr流式传输到某个日志文件,但我希望工作者的stdout和stderr流回终端。这里的所有进程都是Node.js进程。

不知道如何做到这一点或者是否可能。我唯一猜测它是如何工作的,如果终端会话有某种句柄或id我可以使用并告诉工作进程流到该句柄或id。我不太了解* nix知道这是如何工作的。任何解释都会有所帮助。

这是一个视觉效果:

enter image description here

2 个答案:

答案 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的东西。不确定是否有更简单的方法可以做到这一点,但我有一些想法在某种程度上欺骗你的问题,但从长远来看可能更好。

  1. 使用winstonbunyan等日志框架。或者像timequerylog这样的结构化日志记录系统。日志记录框架将允许多个记录器,一个可以转到文件,另一个可以转到stdout。

  2. 使用Cluster内置节点模块创建工作人员,让工作人员使用事件/数据向主人发送消息。然后主人可以记录那些标准输出。