【问题标题】:How to see the current running Linux processes output^如何查看当前正在运行的 Linux 进程输出^
【发布时间】:2013-05-21 17:21:26
【问题描述】:

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

【问题讨论】:

  • 所以您没有足够的磁盘容量来捕获所有输出,但您想选择一个进程并开始查看它的输出?
  • 是的。我有很多磁盘空间。问题是我不喜欢一直打开和关闭文本文件(有些人建议在这个文件中发送输出)以获得最刷新的数据。我更愿意“抓住”这个过程,并在需要时让它变得冗长!

标签: linux process terminal output verbose


【解决方案1】:

您可以将 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 退出时,您将终止所附加的进程。更多详情请见this question

【讨论】:

    【解决方案2】:

    像这样使用重定向

    yourprogram arg1 arg2 > yourprog.out
    

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

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

    在不同的终端,做

    tail -f yourprog.out 
    

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

    但我看不到可移植的重定向方式。也许screenbatchatcron 可能会对您有所帮助。或者打开/proc/1234/fd/1 ...

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

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

    【讨论】:

    • 谢谢,所以我知道要获取最新数据,我每次都必须运行以下命令:tail -f yourprog.out ?当程序在终端中运行时,它并不是真正的实时输出。
    • 不,试试tail -f yourprog.out 它会在文件yourprog.out 增长时显示更多输出,因为其他一些程序(例如yourprogram)正在填充它...
    • 好的...但这不是实时的。我必须运行命令 (tail -f yourprog.out) 以获取文件中最新的文本...我想查看进程的详细输出,就像我在终端中运行程序时一样。
    • tail -f 输出默认每秒更新一次,如果 -s 选项不允许您低于该值(并且您需要),您可以随时编写自己的 :-)跨度>
    • 好吧,我必须说,tail -f 也有同样的“效果”。现在唯一的问题是管理随时间增长的文件的大小。这有什么提示吗?如何在 30 天后删除第一行?
    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2012-11-20
    相关资源
    最近更新 更多