正常来说,我们运行一个程序,它会输出一些log,你可以通过重定向把输出放到一个文件里,比如:
./a.out > a.log
或者更聪明一点,使用tee同时将输出写入文件和标准输出:
./a.out | tee a.log
你可以在这些命令后面使用 & 让程序后台运行,通过检查a.log来看运行情况。
但是,如果你已经通过后台运行了一个程序,也没有将标准输出记录到文件里,然后你退出了登陆,再次进来时,我如何得到它正在进行的log输出呢?
很明显这是一个很不寻常的诉求,我刚刚在使用aria2下载的时候碰到了这个问题,虽然我可以关闭并重启来续传,但是我并不想这么做(断掉的Peer重连也是要一点时间的),于是考虑有没有可能可以偷看到这个已经消失的输出信息。
一开始,我想通过/proc/{pid}/fd
中的输出句柄查看,非常可惜的是,1这个句柄(也就是STDOUT)显示deleted,也就无法再读取或者展示了,那么也就是说,除了hack这个进程本身,可能没有更好的方法了?
gdb应该是调试程序的好手,但是对于已经运行的程序来说,没有比 strace 更合适的了,通过观察manpage,我发现了将输出打印出来的方法,锵锵:
strace -p {pid} -ewrite
这个命令可以将程序的输出打印出来,当然它输出了所有IO,为了过滤,可以这样:
strace -p {pid} -ewrite | grep 'write(1,'
这样就可以只过滤标准输出了,当然,并不完美,因为strace只是输出了一部分,如果文字比较多,它会截断,不过我看看进度已经够了,期待有更好的方式出现。
居然是今天的
shit!!!
这些对我太复杂了,
我只会一些基本的linux命令。