代码之家  ›  专栏  ›  技术社区  ›  theraccoonbear

如何从已经运行的进程中捕获标准输出

  •  21
  • theraccoonbear  · 技术社区  · 14 年前

    我有一个正在运行的cron作业,它将运行一段时间,我想查看它的标准输出。我不知道这个进程是由cron启动的这一事实有多重要,但我想我应该提一下。这是在OSX上,所以,我不能访问/proc/[pid]/…,或truss,或strace。执行IO重定向的建议(例如。 script > output & tail -f output )不可接受,因为此进程1)已在运行,2)无法通过重定向停止/重新启动。如果有通用的解决方案可以跨多个unice工作,那将是理想的,但具体来说,我现在正试图在Mac上实现这一点。

    5 回复  |  直到 14 年前
        1
  •  50
  •   mpyw    8 年前

    将以下函数写入 ~/.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

    dtrace 对El Capitan或更高版本的限制。

    csrutil enable --without dtrace
    
        2
  •  19
  •   Alex Brown    10 年前

    免责声明:没有线索,如果Mac有这个。这种技术存在于Linux上。基督教青年会。

    您可以从/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的一个有用提示。

        3
  •  9
  •   Alex Brown    10 年前

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

        4
  •  1
  •   LaC    13 年前

    neercs 能够“抓取”在it之外启动的程序。也许对你有用。

        5
  •  0
  •   Sodved    13 年前

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