【问题标题】:Attach a program to a process stdout/stderr将程序附加到进程 stdout/stderr
【发布时间】:2011-10-21 12:46:33
【问题描述】:

我有一个程序,我需要附加到给定 pid(从文件中获取)的 stdout/stderr。 这应该怎么做?这甚至可能吗?

编辑 1:

我有一个启动/停止服务器程序的监控程序。但是,监视器可以关闭/重新打开,并且应该连接到现有的服务器标准输出以读取写入标准输出的错误(以及基于某些监视器请求的一些输出)。

编辑 2:

我建立了服务器和监视器,所以我有两者的来源,问题是服务器“回答”了标准输出上的一些监视器请求,我不想添加另一个进程间通信部分

【问题讨论】:

  • 你想要达到什么目的?解释您的意图可能有助于我们更好地建议您。

标签: c unix process


【解决方案1】:

当一个进程正在运行时,没有标准的 Unix 方法可以截取另一个进程的输出并在目标进程启动后开始捕获它。

如果您自己通过execve 启动这些进程,您可以简单地通过pipe(2) 设置管道并将其描述符(通过dup2(2))重定向到子进程的标准输入和标准输出。这样,父母就可以通过管道对孩子的标准输入/标准输出进行写入/读取。

关于编辑后的问题:这似乎很适合 Unix fifo 文件。

fifo 文件(或命名管道)看起来像文件,但在引擎盖下实现为管道。

所以只需创建一个 fifo 文件(使用 mkfifo(1) 命令),通过将其 stdin 和 stdout 描述符重定向到该文件(使用 shell 的 <> 运算符)来启动服务器应用程序,然后你'将能够随时从中读取。

【讨论】:

  • 我已经在研究 fifos,我想避免使用它们来监控部分,但它看起来是我能做到这一点的唯一方法:\
  • 看来这是我唯一的可能了,我讨厌这个
【解决方案2】:

从未尝试过,但您可以查看 /proc/$pid/ 目录,如果可以(具有适当的权限)附加到那里的文件描述符条目。否则我无法想象这怎么可能。


编辑(获取更多详细信息后)

您声明,您的进程将负责启动/停止该服务器进程 - 这让事情变得更容易:)

因为这是作业,我就画图吧:

  • 为服务器的stdinstdout创建命名管道

  • 启动服务器时,将其stdin/stdout与命名管道连接

  • 启动客户端时,读取/写入命名管道

【讨论】:

  • Mhh 坏事......如果是这种情况,我必须重写很大一部分代码
  • 是的,我知道这种方式,但是因为我的老师没有写,当监视器终止时服务器不应该终止,我认为当你关闭监视器时,服务器应该停止。他们选择(现在)情况并非如此,我正在尝试另一种方法来避免重写监视器的很大一部分,该监视器期望在标准输出上得到答案。看起来是不可能的。
【解决方案3】:

您是否可以选择配置服务器,以便将输出发送到日志文件,而不是标准输出?在 unix 机器上,您可以通过 tee 运行服务器以将标准输出记录到文件中:

$ server | tee server.log

那么tail server.log得到最新的输出就很简单了。

$ tail -f server.log

【讨论】:

  • 我建议您更新您的日志记录代码以输出到标准输出和文件或命名管道。
猜你喜欢
  • 1970-01-01
  • 2012-07-14
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
相关资源
最近更新 更多