如何从ALREADY正在运行的进程中捕获stdout

时间:2010-08-06 15:36:41

标签: macos process cron stdout capture

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

5 个答案:

答案 0 :(得分:36)

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

答案 1 :(得分:20)

免责声明:如果Mac有这个,那就没有任何线索了。这种技术存在于Linux上。 YMMV。

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

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

或者将缓冲区中剩余的所有内容都抓取到文件中:

cat /proc/$PID/fd/1

PS:fd / 1是stdout,fd / 2是stderr。


编辑:亚历克斯布朗> Mac没有这个,但它对Linux很有用。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

neercs能够“抓取”在其外部启动的程序。也许它会对你有用。 顺便说一句,你没有桁架或strace,但你确实有dtrace。

答案 4 :(得分:0)

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