我使用以下命令从strace输出中提取系统调用名称:
strace ls 3>&1 1>&2 2>&3 3>&- | grep -P -o '^[a-z]*(?=\()'
,但是此命令在输出中还包含 ls输出。 我该如何预防?
答案 0 :(得分:1)
strace有两个选项,可帮助您获得所需的内容:
-c
将输出该命令运行的所有系统调用的表,以及它们被调用的次数和CPU使用率。$ strace -c ls Desktop Documents Downloads Music Pictures Public Templates Videos % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 31.07 0.000653 20 32 mmap 9.94 0.000209 20 10 mprotect 9.80 0.000206 12 16 read 8.28 0.000174 15 11 close 7.61 0.000160 16 10 fstat 6.90 0.000145 16 9 openat 2.47 0.000052 17 3 3 ioctl ...
-o
选项会将strace的输出发送到文件,因此不会与进程的输出混在一起。以下将运行ls
命令,将其输出转移到/dev/null
,并将strace的输出发送到awk
脚本以提取最后一列:
$ strace -o >(awk '$1 ~ /^-----/ { toprint = !toprint; next } { if (toprint) print $NF }') \
-c ls >/dev/null 2>/dev/null
mmap mprotect read close fstat openat ioctl ...
答案 1 :(得分:0)
最后,我借助以下链接找到了一种解决方案:http://mywiki.wooledge.org/BashFAQ/047
app.html
和一个有用的变种来计算系统调用:
<require from="http://cdn.syncfusion.com/js/assets/external/jquery-1.10.2.min.js"></require>
<require from="http://cdn.syncfusion.com/js/assets/external/jsrender.min.js"></require>
<require from="http://cdn.syncfusion.com/16.3.0.29/js/web/ej.web.all.min.js"></require>
以及使用 Mark Plotnick 的答案的更好解决方案:
strace ls 2>&1 >/dev/null | grep -P -o '^[a-z]*(?=\()'