3

我的计算机上运行了几个 Linux (Ubuntu 10.04) 进程。如果我启动其中一个,我可以在终端上看到它的详细信息。我有另一个进程启动十几个这样的进程,以便它们在后台运行。但是,我想观察这些进程之一的输出,看看输出是否仍然正常并且没有错误消息。我知道我可以将所有内容发送到日志消息中,但是,这只会占用太多磁盘空间。那么,有没有办法使用它的进程 ID“捕获”Linux 中正在运行的进程的输出?

4

2 回答 2

4

您可以将gdb附加到正在运行的进程,并在您想查看输出时将 stdout/err 或两者都重定向到某个日志文件(在重定向之前确保文件存在):

gdb 附加 PID
  (gdb) p dup2(open("/tmp/mylogfile-stdout", 0), 1)
  (gdb) p dup2(open("/tmp/mylogfile-stderr", 0), 2)
  (gdb) 分离
  (gdb) 退出

当您希望他们恢复沉默时,只需执行以下操作:

gdb 附加 PID
  (gdb) p dup2(open("/dev/null", 0), 1)
  (gdb) p dup2(open("/dev/null", 0), 2)
  (gdb) 分离
  (gdb) 退出

“分离”部分很重要,否则您将在 gdb 退出时终止您附加的进程。有关更多详细信息,请参阅此问题

于 2013-05-30T14:49:03.380 回答
1

使用重定向,如

yourprogram arg1 arg2 > yourprog.out

甚至可能(重定向标准错误和标准输出并在后台运行)

yourprogram arg1 arg2 > yourprog.out 2>&1 &

在不同的终端,做

tail -f yourprog.out 

使用该-f选项,该tail命令将在文件增长时通知并显示其最新行

但是我看不到可移植的重定向方式。也许screen, batch, at,cron可能会帮助你。或者打开/proc/1234/fd/1...

顺便说一句,我很惊讶你没有足够的临时磁盘空间来输出......

而且我确实喜欢M-x shell在 emacs 下运行,并在那里运行我的程序。

于 2013-05-26T20:16:43.423 回答