You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用grep捕获字段执行命令?实现一键strace目标进程

如何提取进程PID并一键执行strace

我来给你几个实用的方法,直接一步到位完成PID捕获+strace执行:

方法1:用awk直接提取PID(最稳妥)

ps -ef的输出里第二列就是PID,用awk匹配目标进程的命令行,直接提取这一列就行,还能顺便排除掉awk自身的进程:

sudo strace -f -p$(ps -ef | awk '/\/usr\/bin\/python3 \/home\/pi\/readcard.py/ && !/awk/ {print $2}') -s9999 -e write

解释一下:

  • awk '/目标命令行/ && !/awk/':只匹配目标进程,排除awk自己的进程(避免误抓)
  • {print $2}:输出第二列的PID
  • $(...):把括号里命令的输出作为参数传给strace的-p选项

方法2:用pgrep简化操作(最简洁)

pgrep专门用来查找进程ID,-f选项可以匹配整个命令行,比ps+grep更省心:

sudo strace -f -p$(pgrep -f "/usr/bin/python3 /home/pi/readcard.py") -s9999 -e write

如果有多个匹配的进程,你可以加-n取最新的,或者-o取最旧的,比如pgrep -fn "/usr/bin/python3 /home/pi/readcard.py"

方法3:用grep的Perl正则捕获PID(符合你的正则思路)

如果你坚持用grep来捕获PID,可以用-oP选项开启Perl兼容正则,用\K忽略前面的匹配内容,只提取PID部分:

sudo strace -f -p$(ps -ef | grep -oP '^\w+\s+\K\d+(?=\s+.*\/usr\/bin\/python3 \/home\/pi\/readcard.py)') -s9999 -e write

解释正则部分:

  • ^\w+\s+:匹配开头的用户名(比如root)和后面的空格
  • \K:忽略前面匹配的内容,只保留后面的结果
  • \d+:匹配PID数字
  • (?=\s+.*目标命令行):正向断言,确保后面跟着目标进程的命令行

小提示

如果怕匹配到多个进程,记得加head -1只取第一个PID,比如:

sudo strace -f -p$(ps -ef | awk '/\/usr\/bin\/python3 \/home\/pi\/readcard.py/ && !/awk/ {print $2}' | head -1) -s9999 -e write

内容的提问来源于stack exchange,提问作者ikenas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:57:52