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