正在尝试跟踪 apache2。这些是我正在尝试运行的命令。
ps auxw | grep sbin/apache | awk '{print"-p " $2}' | xargs strace >> trace.txt
我试过
(ps auxw | grep sbin/apache | awk '{print"-p " $2}' | xargs strace ) >> trace.txt
或者
ps auxw | grep sbin/apache | awk '{print"-p " $2}' | xargs strace | xargs >> trace.txt
答案1
不能使用 -o 标志有什么特殊原因吗?
ps auxw | grep sbin/apache | awk '{print " -p " $2}' | xargs strace -o /tmp/trace.txt
此外,您应该使用一些正则表达式技巧来避免在进程列表中捕获 grep 进程。
ps auxw | grep 'sbin/[a]pache' ....
还要记住,在 Apache 的具体情况下,
- Apache (通常) 是多进程的,您想要获取父进程还是子进程之一?我会将 '-f' 标志添加到 strace,它 (除其他外) 会在输出中插入 PID。
您可以从 PID 文件中获取主父进程的进程 ID。
例如 strace -o /tmp//trace.txt -f $(< /path/to/apache.pid)
所以,这就是你要问的问题。。但是你想做什么?启动时调试?跟踪处理请求的子进程?还要查看 apache 的 -X 标志。
答案2
一般来说,strace“可以重定向到一个文件”,但它会将其输出写入 stderr(将其与程序的 stderr 混合),因此它就像
strace progname 2>my_strace_output
如果您希望“所有输出”都转到一个文件:
strace progname 1>my_strace_output 2>&1
如果你想能够“grep”它:
strace progname 2>&1 | grep ...
但请注意,如果您使用 grep 并将其发送到文件,则会发生大量缓冲:https://unix.stackexchange.com/questions/338330/grepping-strace-output-gets-hard
答案3
ps auxw | grep sbin/apache | awk '{print"-p " $2}' | xargs strace 2>> trace.txt
答案4
您还可以通过以下方式将标准输出定向到文件:
(time /bin/ls) &> /tmp/time.txt
或者调试 php 脚本:
(strace php /path/to/www/script.php) &> strace_output.txt