我有一些应该停止运行的脚本,但永远都是这样.
有什么办法可以用可读的方式弄清楚他们写的是什么?stdout和stderr?
例如,我试过这样做
$ tail -f /proc/(pid)/fd/1
但这并没有真正起作用.无论如何,这是一个长镜头.
还有其他想法吗?因为看到这一点,它本身就是非常冗长和难以理解的.
注意:我只对他们的输出感兴趣,而不是其他任何东西.我有能力自己搞清楚其他事情; 这个问题只关注在启动它之后访问正在运行的进程的stdout和stderr .
由于我不允许编辑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的输出.
有几个新的实用程序包含"gdb方法"并添加一些额外的触摸.我现在使用的那个叫做"reptyr"("Re-PTY-er").除了抓住STDERR/STDOUT之外,它实际上会改变进程的控制终端(即使之前没有连接到终端).
最好的用法是启动一个屏幕会话,并使用它将一个正在运行的进程重新连接到屏幕上的终端,以便您可以安全地从它中分离并稍后返回.
它包装在流行的发行版上(例如:'apt-get install reptyr').
http://onethingwell.org/post/2924103615/reptyr
Gdb方法似乎更好,但你也可以用strace做到这一点:
strace -p -e write = 1 -s 1024 -o file
$ strace -p-e write=1 -s 1024 -o file
这打印出的比你需要的更多(十六进制部分),但是你可以很容易地把它打开.
我不确定它是否适合您,但我在前一段时间阅读了一个描述使用gdb的方法的页面
我使用了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"
我从其他答案中组合了此命令。