当前位置:  开发笔记 > 编程语言 > 正文

一个进程如何拦截Linux上另一个进程的stdout和stderr?

如何解决《一个进程如何拦截Linux上另一个进程的stdout和stderr?》经验,为你挑选了5个好方法。

我有一些应该停止运行的脚本,但永远都是这样.

有什么办法可以用可读的方式弄清楚他们写的是什么?stdout和stderr?

例如,我试过这样做

$ tail -f /proc/(pid)/fd/1

但这并没有真正起作用.无论如何,这是一个长镜头.

还有其他想法吗?因为看到这一点,它本身就是非常冗长和难以理解的.

注意:我对他们的输出感兴趣,而不是其他任何东西.我有能力自己搞清楚其他事情; 这个问题只关注在启动它之后访问正在运行的进程的stdout和stderr .



1> Thomas Vande..:

由于我不允许编辑Jauco的答案,我将给出适合我的完整答案(Russell的页面依赖于无保障的行为,如果你关闭stdout的fd 1,下一个creat呼叫将打开fd 1.

所以,运行一个简单的无尽脚本,如下所示:

import time

while True:
    print 'test'
    time.sleep(1)

保存到test.py,运行

$ python test.py

得到pid:

$ ps auxw | grep test.py

现在,附上gdb:

$ gdb -p (pid)

做fd魔术:

(gdb) call creat("/tmp/stdout", 0600)
$1 = 3
(gdb) call dup2(3, 1)
$2 = 1

现在你可以tail/tmp/stdout并查看以前用于stdout的输出.


无论如何,dup2解决方案更好,但是(关于creat返回1)只要使用0并且没有其他人正在创建文件描述符,它就不能保证:UNIX保证返回最低的可用fd数.

2> Mark Renouf..:

有几个新的实用程序包含"gdb方法"并添加一些额外的触摸.我现在使用的那个叫做"reptyr"("Re-PTY-er").除了抓住STDERR/STDOUT之外,它实际上会改变进程的控制终端(即使之前没有连接到终端).

最好的用法是启动一个屏幕会话,并使用它将一个正在运行的进程重新连接到屏幕上的终端,以便您可以安全地从它中分离并稍后返回.

它包装在流行的发行版上(例如:'apt-get install reptyr').

http://onethingwell.org/post/2924103615/reptyr



3> 小智..:

Gdb方法似乎更好,但你也可以用strace做到这一点:

strace -p -e write = 1 -s 1024 -o file

$ strace -p  -e write=1 -s 1024 -o file

这打印出的比你需要的更多(十六进制部分),但是你可以很容易地把它打开.



4> Jauco..:

我不确定它是否适合您,但我在前一段时间阅读了一个描述使用gdb的方法的页面



5> Lari Hotari..:

我使用了strace并解码了十六进制输出以清除文本:

PID=some_process_id
sudo strace -f -e trace=write -e verbose=none -e write=1,2 -q -p $PID -o "| grep '^ |' | cut -c11-60 | sed -e 's/ //g' | xxd -r -p"

我从其他答案中组合了此命令。

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有