我有一个程序,我需要附加到给定pid的stdout / stderr(从文件中获取)。 应该怎么做?这甚至可能吗?
编辑1:
我有一个启动/停止服务器程序的监控程序。但是,可以关闭/重新打开监视器,并且应该挂钩到现有的服务器标准输出以读取写在stdout上的错误(以及基于某些监视器请求的某些输出)。
编辑2:
我构建了服务器和监视器所以我有两者的来源,问题是服务器“回答”stdout上的一些监视器请求,我不想添加另一个进程间通信部分
答案 0 :(得分:2)
当一个进程正在运行时,没有一种标准的Unix方法来拦截来自另一个进程的输出,并在目标进程启动后开始捕获它。
如果您是通过execve
自行启动这些流程,则只需通过pipe(2)
设置管道,并将其描述符(通过dup2(2)
)重定向到子流程' stdin和stdout。这样父母就可以通过管道写入/读取孩子的stdin / stdout。
关于编辑后的问题:这似乎非常适合Unix fifo文件。
fifo文件(或命名管道)看起来像文件,但是作为发动机罩下的管道实现。
所以只需创建一个fifo文件(使用mkfifo(1)
命令),通过将其stdin和stdout描述符重定向到该文件来启动服务器应用程序(使用<
和>
运算符shell),你随时都可以阅读它。
答案 1 :(得分:1)
从未尝试过,但如果可以(具有适当的权限)附加到那里的文件描述符条目,您可以查看/ proc / $ pid /目录。否则我无法想象这是怎么可能的。
编辑(获取更多详细信息后)
您声明,您的流程将可以启动/停止该服务器流程 - 这使事情变得更加容易:)
由于这是作业,我只是画出画面:
为服务器的 stdin 和 stdout 创建命名管道
启动服务器时,将 stdin / stdout 连接到命名管道
启动客户端时,从/向命名管道读取/写入
答案 2 :(得分:0)
您是否可以选择配置服务器,以便将输出发送到日志文件,或者除了stdout之外?在unix框中,您可以通过tee
运行服务器以将stdout记录到文件中:
$ server | tee server.log
然后拖尾server.log来获取最新的输出是一件简单的事情。
$ tail -f server.log