如何捕获Linux服务器每15分钟发起6881端口UDP请求的进程PID?
追踪短生命周期进程的UDP发包行为
碰到这种仅存活0.5微秒的短生命周期进程发起的网络请求,确实没法用netstat/lsof这类工具——它们刚启动准备抓取,进程已经退出了。下面给你几个经过验证的靠谱方案,按推荐优先级排序:
方法1:用auditd监控系统调用(最稳定通用)
Linux的auditd可以追踪内核级的系统调用,进程发送UDP包必然会调用sendto或sendmsg,我们可以精准过滤目标端口的请求:
- 先确保auditd已安装:
# Debian/Ubuntu sudo apt install auditd # RHEL/CentOS sudo yum install auditd - 添加审计规则,追踪6881端口的UDP发送调用(64位系统用
b64,32位换b32):sudo auditctl -a exit,always -F arch=b64 -S sendto -S sendmsg -F dport=6881 -F proto=udp - 等待下一次15分钟周期的发包,然后查看审计日志:
日志里会明确显示PID、进程名、程序绝对路径,甚至调用时的命令行参数。sudo ausearch -m syscall -i | grep 6881 - 用完记得删除规则,避免持续占用系统资源:
sudo auditctl -d exit,always -F arch=b64 -S sendto -S sendmsg -F dport=6881 -F proto=udp
方法2:用eBPF工具实时追踪(高效灵活)
eBPF是内核级的追踪技术,能在事件发生瞬间捕获信息,完全不会错过短进程。推荐用bcc工具集的trace命令:
- 安装bcc工具:
# Debian/Ubuntu sudo apt install bcc # RHEL/CentOS sudo yum install bcc - 运行追踪命令,过滤目标端口6881的UDP发送:
一旦有符合条件的发包,会立刻输出进程的PID和名称,你可以快速用sudo trace -n 'udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) { printf("PID: %d | 进程名: %s | 目标端口: %d\\n", pid, comm, ntohs(sk->__sk_common.skc_dport)); }' | grep 6881readlink /proc/<PID>/exe获取程序路径(动作要快,进程可能马上退出)。
方法3:SystemTap脚本追踪(适合定制场景)
如果需要更定制化的追踪逻辑,可以用SystemTap:
- 安装SystemTap:
# Debian/Ubuntu sudo apt install systemtap # RHEL/CentOS sudo yum install systemtap - 创建一个脚本
udp_trace.stp:probe syscall.sendto { # 17是UDP协议的编号,过滤目标端口6881 if (pid() != 0 && dport == 6881 && proto == 17) { printf("PID: %d\\n进程名: %s\\n程序路径: %s\\n命令行: %s\\n---\\n", pid(), execname(), cmdline_str(), cmdline_args()) } } - 运行脚本:
等待触发即可捕获进程信息。sudo stap -v udp_trace.stp
注意:以上方法都需要root权限才能运行,用完记得停止追踪/删除规则,避免不必要的性能开销。
内容的提问来源于stack exchange,提问作者Markus




