我想用strace捕获某个东西然后立即退出。这样程序就可以保持活力:strace ... program 2>&1 | grep --line-buffered ... | read line
.
有没有一种简单的方法可以让 strace 在 strace 本身终止后杀死程序?
这就是我解决它的方法:
(strace ... program 2>&1 & echo $! >&3) 3>pid | grep --line-buffered ... | while read line; do
kill `<pid`
break
done
但看起来不太好看。
更新:
事实证明,实际的问题是我跟踪的程序忽略了 SIGPIPE。我想解决这个问题的干净方法是创建一个附加层来拦截 SIGPIPE 并发送 SIGTERM。
答案1
如果您的 grep 支持它,您可以使用grep -m 1 ...
它来让它在找到匹配项后停止。假设它继续写入,这将导致管道关闭并且 strace 终止。