【问题标题】:How can I capture the stdout from a process that is ALREADY running如何从已经运行的进程中捕获标准输出
【发布时间】:2011-03-26 10:00:42
【问题描述】:

我有一个正在运行的 cron 作业,它将持续一段时间,我想查看它的标准输出。我不知道进程由 cron 启动的事实有多重要,但我想我会提到它。这是在 OSX 上,所以我无法访问诸如... /proc/[pid]/...、truss 或 strace 之类的东西。使用 IO 重定向执行的建议(例如script > output & tail -f output)是不可接受的,因为此进程 1) 已在运行,并且 2) 无法通过重定向停止/重新启动。如果有适用于各种 Unices 的通用解决方案,那将是理想的,但具体来说,我现在正尝试在 Mac 上完成此任务。

【问题讨论】:

标签: macos process cron stdout capture


【解决方案1】:

真正的 OSX 解决方案

将以下函数写入您的~/.bashrc~/.zshrc

capture() {
    sudo dtrace -p "$1" -qn '
        syscall::write*:entry
        /pid == $target && arg0 == 1/ {
            printf("%s", copyinstr(arg1, arg2));
        }
    '
}

用法:

example@localhost:~$ perl -e 'STDOUT->autoflush; while (1) { print "Hello\n"; sleep 1; }' >/dev/null &
[1] 97755
example@localhost:~$ capture 97755
Hello
Hello
Hello
Hello
...

https://github.com/mivok/squirrelpouch/wiki/dtrace

注意:

您必须禁用 El Capitan 或更高版本的 dtrace 限制。

csrutil enable --without dtrace

【讨论】:

  • 谢谢。 5 年后,但这确实有效。 Mark Renouf 的回答得到如此高的评价真是太可惜了。虽然它可能适用于 *nix 系统,但这完全不是问题的重点。
  • 将此添加到 ~/.profile 并立即生效!
  • 这是捕获标准输出和标准错误还是仅仅捕获标准输出?
  • 在 MacOS Sierra (10.12.6) 上出现此错误:csrutil: requesting an unsupported configuration. This is likely to break in the future and leave your machine in an unknown state. csrutil: failed to modify system integrity configuration. This tool needs to be executed from the Recovery OS.
  • 这是一个信息性错误,您必须在期望此功能正常工作之前执行此操作。它在 10.13 上也适用。
【解决方案2】:

使用dtruss -p <PID>,甚至rwsnoop -p <PID>

【讨论】:

  • 这非常有效。具体来说:sudo dtruss -p <PID> -t write
【解决方案3】:

免责声明:不知道 Mac 是否有此功能。这种技术存在于 Linux 上。 YMMV。

您可以从 /proc 获取 stdout/err(假设有适当的权限):

PID=$(pidof my_process)
tail -f /proc/$PID/fd/1

或将缓冲区中剩余的所有内容保存到文件中:

cat /proc/$PID/fd/1

PS:fd/1 是标准输出,fd/2 是标准错误。


编辑:Alex brown> Mac 没有这个,但它对 Linux 来说是一个有用的提示。

【讨论】:

  • 来自我的问题:这是在 OSX 上,所以我无权访问... /proc/[pid]/
  • tail -f /proc/$PID/fd/1 在 LInux 上没有为我打印任何内容
【解决方案4】:

neercs 能够“抓取”在其外部启动的程序。也许它会为你工作。 顺便说一句,你没有 truss 或 strace,但你有 dtrace。

【讨论】:

  • 我安装了 libcaca 并且能够让 neercs 找到它,但是 neercs 的 ./configure 失败,开头为:lock.c:26:29: error: pam/pam_appl.h:没有这样的文件或目录,然后报告许多其他 PAM 相关的错误。
【解决方案5】:

我认为你从 cron 开始的事实可以拯救你。在 linux 下,cron 作业的任何标准输出都会邮寄到拥有该作业的用户的 unix 邮件帐户。虽然不确定OSX。不幸的是,您必须等待作业完成才能发送邮件,然后才能查看输出。

【讨论】:

  • 不幸的是,这是(曾经)一个长时间运行的过程,我想在其漫长的运行时间完成之前获得输出。
猜你喜欢
  • 2020-09-29
  • 2011-01-06
  • 1970-01-01
  • 2010-10-29
  • 2011-11-28
  • 1970-01-01
  • 2010-12-09
  • 2018-12-10
  • 2010-12-04
相关资源
最近更新 更多