终止 strace 程序的最优雅的方式

终止 strace 程序的最优雅的方式

我想用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 终止。

相关内容