如何捕获正在运行的进程的stdout stderr输出

时间:2019-07-20 08:37:51

标签: logging trace

我需要编写一个程序,将同一台机器上其他正在运行的进程的stdout / stderr输出捕获到一个变量中。 我想稍后再将这些字节转换为其他字节并对其执行任意操作,但这超出了此问题的范围。

我的输入是PID的列表,我们可以假定它们是有效的,并且实际上正在使用这些PID运行进程。我的目标拱门是Linux,但同样提及其他主机(例如Windows)的答案也将不胜感激。

对于每个PID,每次使用该PID的进程将其写入stdout或stderr时,我都需要一个事件回调,该回调将给出该进程所写入的原始字节的内容完全不进行转换(请注意,如果缓冲了多个消息,就可以了)我可以使用的变量。

我不在乎答案是针对哪种编程语言/环境的,只要它们是主流语言(C,C ++,Go,Node.js等都可以)就可以了。

关于堆栈溢出的类似问题建议将跟踪的进程作为捕获其stdout / stderr的进程的子进程来运行。这不是我的用例。这些PID分别运行,不能作为子进程生成。

其他类似问题也可以使用strace或gdb等现有程序来完成。我知道该怎么做,这不是我想要的。将库用于编程语言很好,但是我不想添加单独的程序依赖项(转储现有开放源代码程序的整个源代码也是不可能的...除非它们明确提供了lib版本) ,例如curl和libcurl)。

我想要一个答案,用任何主流编程语言来描述,使用PID或PID列表作为输入,每次使用这些PID的进程将stdout或stderr写入进程时,如何创建事件侦听器来调用回调/ s。

请注意,如果PID进程产生子进程或以其他方式进行多线程处理,我也希望能够从其产生的线程中跟踪stdout / stderr。

我目前正在阅读有关C的sys / ptrace.h linux api的信息,因为我认为这是这里的方向,但是如果有人已经对此有经验并知道答案,请分享。

0 个答案:

没有答案