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