在Linux中查看已运行进程的输出

12

我有一个在后台运行的进程(sh脚本),我想知道是否可以在不打断它的情况下查看此进程的输出。

该进程由某个应用程序运行,否则我将把它连接到屏幕以供稍后查看。这可能需要一个小时才能完成,我想确保它正常运行且没有错误。


2
它是什么类型的输出?它是纯文本吗?如果是,您可以使用“tail -f <output file>”。tail获取文件的末尾,-f标志告诉它“跟随”文件。tail命令有其他选项,可以指定要等待多少行以及我认为在轮询文件之间要等待多长时间。 - Mike
问题是,我没有启动这个进程,它是由某个应用程序提供商启动的(cpanel安装程序),而且他们没有将输出重定向到任何文件,否则我就可以像你建议的那样使用tail了,有没有办法查看输出? - AL-Kateb
2个回答

4

已经有一个在Linux中使用ptrace(2)来实现此功能的程序,retty:

http://pasky.or.cz/dev/retty/

如果您的运行程序已经连接到tty,则它可以工作,我不知道如果您在后台运行程序是否会起作用。至少它可能会给出一些好的提示。 :)
您可以使用ptrace(2)从程序中检索退出代码,否则只需使用gdb -p <pid>附加到进程,当程序死亡时将打印退出代码。
您还可以使用gdb操作文件描述符:
(gdb) p close(1)
$1 = 0
(gdb) p creat("/tmp/stdout", 0600)
$2 = 1

http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-process/


1

你可以尝试钩入/proc/[pid]/fd/[012]三元组,但很可能不起作用。

我脑海中浮现的下一个想法是strace -p [pid],但你会得到“漂亮”的输出。可能的解决方案是通过使用ptrace(2)编写一个小程序来跟踪自己,以钩入write(2)并将数据写入某个地方。它会起作用,但如果你不习惯C编程,这并不是一件轻松的事情。

不幸的是,我想不出一个能够精确满足你要求的程序,这就是为什么我给你一个提示,告诉你如何自己编写它。祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接