我有一些应该停止运行的脚本,但永远都是这样.
有什么办法可以用可读的方式弄清楚他们写的是什么?stdout和stderr?
例如,我试过这样做
$ tail -f /proc/(pid)/fd/1
Run Code Online (Sandbox Code Playgroud)
但这并没有真正起作用.无论如何,这是一个长镜头.
还有其他想法吗?因为看到这一点,它本身就是非常冗长和难以理解的.
注意:我只对他们的输出感兴趣,而不是其他任何东西.我有能力自己搞清楚其他事情; 这个问题只关注在启动它之后访问正在运行的进程的stdout和stderr .
Tho*_*ele 42
由于我不允许编辑Jauco的答案,我将给出适合我的完整答案(Russell的页面依赖于无保障的行为,如果你关闭stdout的fd 1,下一个creat呼叫将打开fd 1.
所以,运行一个简单的无尽脚本,如下所示:
import time
while True:
print 'test'
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
保存到test.py,运行
$ python test.py
Run Code Online (Sandbox Code Playgroud)
得到pid:
$ ps auxw | grep test.py
Run Code Online (Sandbox Code Playgroud)
现在,附上gdb:
$ gdb -p (pid)
Run Code Online (Sandbox Code Playgroud)
做fd魔术:
(gdb) call creat("/tmp/stdout", 0600)
$1 = 3
(gdb) call dup2(3, 1)
$2 = 1
Run Code Online (Sandbox Code Playgroud)
现在你可以tail/tmp/stdout并查看以前用于stdout的输出.
Mar*_*ouf 10
有几个新的实用程序包含"gdb方法"并添加一些额外的触摸.我现在使用的那个叫做"reptyr"("Re-PTY-er").除了抓住STDERR/STDOUT之外,它实际上会改变进程的控制终端(即使之前没有连接到终端).
最好的用法是启动一个屏幕会话,并使用它将一个正在运行的进程重新连接到屏幕上的终端,以便您可以安全地从它中分离并稍后返回.
它包装在流行的发行版上(例如:'apt-get install reptyr').
http://onethingwell.org/post/2924103615/reptyr
小智 8
Gdb方法似乎更好,但你也可以用strace做到这一点:
strace -p -e write = 1 -s 1024 -o file
$ strace -p <PID> -e write=1 -s 1024 -o file
Run Code Online (Sandbox Code Playgroud)
这打印出的比你需要的更多(十六进制部分),但是你可以很容易地把它打开.
我使用了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"
Run Code Online (Sandbox Code Playgroud)
我从其他答案中组合了此命令。