是否可以从已经运行的Java程序中获取/拦截输出?
这是我的情况:我正在运行一个需要几个小时才能完成的程序。所以我启动它,让计算机完成它的工作。我可以使用SSH登录运行该程序的计算机,并使用 ps 查看它运行,但我想拦截写入控制台的输出。
有没有办法做到这一点?
我是否需要提供额外信息?
答案 0 :(得分:6)
在screen
会话中启动应用程序,从会话中分离,稍后您可以进入并重新连接以查看进度。
以下是using screen的一些信息。
另一种选择是将标准输出和标准错误重定向到文件,并使用tail
之类的内容来查看其内容。例如:my_program &> /tmp/output
好吧,我刚才意识到我有点偏离主题,因为我处理了你必须提前思考的案例。现在,如果想要从正在运行的流程中获取它,您可以使用gdb
。
gdb -p process_id
(gdb) p close(1)
$1 = 0
(gdb) p creat(“/tmp/output″, 0600)
$2 = 1
(gdb) q
这会将输出设置为/tmp/output
,您可以再次使用tail
以交互方式查看输出。
答案 1 :(得分:0)
是的,您应该捕获它的标准输入,输出和错误流。查看$ man popen
或this SO question。
编辑:对于已经运行的进程,看看是否可以将基本调试器附加到进程并按上述方式复制输入和输出流。