Linux中获取已后台运行进程的输出

By | 2019/11/03

正常来说,我们运行一个程序,它会输出一些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只是输出了一部分,如果文字比较多,它会截断,不过我看看进度已经够了,期待有更好的方式出现。

One thought on “Linux中获取已后台运行进程的输出

发表评论

电子邮件地址不会被公开。 必填项已用*标注