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

the*_*ear 23 macos cron stdout process capture

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

mpy*_*pyw 39

OSX的真正解决方案

将以下功能写入您的~/.bashrc~/.zshrc.

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

用法:

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
...
Run Code Online (Sandbox Code Playgroud)

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

注意:

您必须禁用dtraceEl Capitan或更高版本的限制.

csrutil enable --without dtrace
Run Code Online (Sandbox Code Playgroud)

  • 在MacOS Sierra(10.12.6)上我收到此错误:`csrutil:请求不支持的配置.这可能会在未来中断并使您的机器处于未知状态.csrutil:无法修改系统完整性配置.此工具需要从Recovery OS执行 (8认同)
  • 将此添加到`〜/ .profile`并立即开始工作! (3认同)
  • 这是一个信息性错误,您必须在期望此功能正常工作之前执行此操作。它也适用于 10.13。 (2认同)
  • 这篇文章不适用于 macOS 12.0.1 ---> dtrace: 无法获取 pid 7696: (null),并且 https://github.com/mivok/squirrelpouch/wiki/dtrace 不存在。 (2认同)

Mar*_*ouf 20

免责声明:如果Mac有这个,那就不清楚了.这种技术存在于Linux上.因人而异.

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

PID=$(pidof my_process)
tail -f /proc/$PID/fd/1
Run Code Online (Sandbox Code Playgroud)

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

cat /proc/$PID/fd/1
Run Code Online (Sandbox Code Playgroud)

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


编辑:亚历克斯布朗> Mac没有这个,但它是Linux的一个有用的提示.

  • `tail -f/proc/$ PID/fd/1`在LInux上没有为我打印任何内容 (5认同)
  • 如果@cking爱你. (4认同)
  • 从我的问题:这是在OSX所以,我没有访问像.../proc/[pid] / (3认同)

Ale*_*own 5

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

  • 这非常有效。具体来说:`sudo dtruss -p &lt;PID&gt; -t write` (2认同)