将 strace 重定向到文件

Mar*_*rin 19 linux xargs

我正在尝试跟踪 apache2。这些是我试图运行的命令。

ps auxw | grep sbin/apache | awk '{print"-p " $2}' | xargs strace >> trace.txt
Run Code Online (Sandbox Code Playgroud)

我试过

(ps auxw | grep sbin/apache | awk '{print"-p " $2}' | xargs strace ) >> trace.txt
Run Code Online (Sandbox Code Playgroud)

或者

ps auxw | grep sbin/apache | awk '{print"-p " $2}' | xargs strace | xargs >> trace.txt
Run Code Online (Sandbox Code Playgroud)

Ric*_*lka 22

您不能使用 -o 标志的任何特殊原因?

ps auxw | grep sbin/apache | awk '{print " -p " $2}' | xargs strace -o /tmp/trace.txt
Run Code Online (Sandbox Code Playgroud)

此外,您应该使用一些正则表达式技巧来避免在进程列表中捕获您的 grep 进程。

ps auxw | grep 'sbin/[a]pache' ....
Run Code Online (Sandbox Code Playgroud)

还要记住,在 apache 的特定情况下,

  1. Apache(通常)是多进程的,您是要获取父进程还是其中一个子进程?我将'-f'标志添加到strace,它(除其他外)在输出中插入PID。
  2. 您可以从 PID 文件中获取主父进程的进程 ID。

    例如 strace -o /tmp//trace.txt -f $(< /path/to/apache.pid)

所以,这就是你要问的问题......但是你想做什么?开机调试?strace 服务于请求的子进程?另请查看 apache 的 -X 标志。


rog*_*ack 8

一般来说,strace“可以重定向到一个文件”,但它会将其输出写入 stderr(将其与程序的 stderr 混合),所以它就像

strace progname 2>my_strace_output
Run Code Online (Sandbox Code Playgroud)

如果您希望“所有输出”转到文件:

strace progname 1>my_strace_output 2>&1
Run Code Online (Sandbox Code Playgroud)

如果你想能够“grep”它:

strace progname 2>&1 | grep ...
Run Code Online (Sandbox Code Playgroud)

但是请注意,如果您使用 grep 并将其发送到文件中会发生大量缓冲:https : //unix.stackexchange.com/questions/338330/grepping-strace-output-gets-hard