You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何捕获Linux服务器每15分钟发起6881端口UDP请求的进程PID?

追踪短生命周期进程的UDP发包行为

碰到这种仅存活0.5微秒的短生命周期进程发起的网络请求,确实没法用netstat/lsof这类工具——它们刚启动准备抓取,进程已经退出了。下面给你几个经过验证的靠谱方案,按推荐优先级排序:

方法1:用auditd监控系统调用(最稳定通用)

Linux的auditd可以追踪内核级的系统调用,进程发送UDP包必然会调用sendtosendmsg,我们可以精准过滤目标端口的请求:

  • 先确保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分钟周期的发包,然后查看审计日志:
    sudo ausearch -m syscall -i | grep 6881
    
    日志里会明确显示PID、进程名、程序绝对路径,甚至调用时的命令行参数。
  • 用完记得删除规则,避免持续占用系统资源:
    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发送:
    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 6881
    
    一旦有符合条件的发包,会立刻输出进程的PID和名称,你可以快速用readlink /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

火山引擎 最新活动