可使用strace工具实时跟踪linux进程的系统调用:一、基础跟踪单个命令;二、附加到已运行进程;三、过滤特定调用并高亮失败项;四、保存结果至文件;五、结合lsof等工具协同诊断。

如果您需要观察某个Linux进程在运行过程中执行了哪些系统调用及其参数、返回值和执行时长,则可以使用strace工具进行实时跟踪。以下是完成该任务的具体操作步骤:
一、基础跟踪单个命令的系统调用
strace默认以新进程方式启动目标程序,并完整捕获其生命周期内的所有系统调用。该方法适用于调试短时运行的命令,便于快速查看调用序列与错误来源。
1、在终端中输入 strace ls -l /tmp,执行后将显示ls命令发起的全部系统调用过程。
2、观察输出中每行的格式:系统调用名、括号内参数、等号后返回值,如 openat(AT_FDCWD, "/tmp", O_RDONLY|O_CLOEXEC) = 3。
3、按 Ctrl+C 可中断正在运行的目标命令及strace跟踪。
二、附加到已运行进程进行跟踪
当目标进程已在后台持续运行时,可使用-p选项将其PID传入strace,实现动态注入式跟踪,无需重启进程。
1、执行 ps aux | grep nginx 获取目标进程的PID,例如显示为 12345。
2、运行 strace -p 12345 开始跟踪该进程的系统调用流。
3、如需同时捕获子进程调用,追加 -f 参数:strace -f -p 12345。
三、过滤特定系统调用并高亮关键事件
strace支持通过-e选项限定只显示指定类别或名称的系统调用,减少冗余输出,提升问题定位效率。
1、仅跟踪文件相关调用:执行 strace -e trace=open,openat,read,write,close ls /etc/hosts。
2、排除信号类调用以聚焦I/O行为:使用 strace -e trace=!signal,rt_sigreturn,kill sleep 2。
3、高亮失败调用(返回值为-1):添加 -z 参数,使失败项以特殊标记显示。
四、将跟踪结果保存至文件以便离线分析
对于长时间运行或高频率调用的进程,直接在终端滚动查看易遗漏细节,将输出重定向至文件更利于后续检索与比对。
1、执行 strace -o /tmp/trace.log -s 256 -T curl -I https://example.com,其中 -s 256 扩展字符串打印长度,-T 显示每次调用耗时。
2、跟踪结束后,使用 less /tmp/trace.log 查看完整记录。
3、若需实时追加写入已有日志,改用 strace -o /tmp/trace.log -a 8 -t -f -p 12345,其中 -t 添加时间戳,-a 8 对齐输出列宽。
五、结合其他工具协同诊断系统行为
strace本身不提供上下文堆栈或内存映射信息,需配合lsof、pstack、/proc/PID/下的虚拟文件等手段交叉验证异常现象。
1、在strace发现某次 connect() 调用超时失败后,立即执行 lsof -p 12345 检查该进程打开的socket状态与地址族。
2、若怀疑线程阻塞,另启终端运行 pstack 12345 获取当前所有线程的函数调用栈。
3、查阅 /proc/12345/status 和 /proc/12345/fd/ 目录内容,确认进程资源限制与句柄占用情况。










