如何获取向系统发起网页打开请求的进程的链接与PID?
如何获取发起网页打开请求的进程PID与链接
我来帮你搞定这个问题!首先得明确:当应用请求系统打开网页时,通常是通过xdg-open这类桌面工具调用你的自定义Desktop Entry,你的脚本的直接父进程是xdg-open而非发起请求的应用,所以默认拿不到源头进程信息。下面是两种可靠的解决方案:
方法1:在自定义脚本中追踪父进程链
这种方法不需要root权限,适合普通用户使用。你可以修改Desktop Entry对应的执行脚本,让它自动向上追踪进程树,排除桌面工具和环境进程,找到真正的发起者。
示例脚本
把你的Desktop Entry的Exec指向这个脚本(记得替换成你的真实浏览器路径):
#!/bin/bash TARGET_URL="$1" SELF_PID=$$ CURRENT_PID=$SELF_PID # 向上遍历父进程链,排除桌面工具和环境进程 while true; do # 获取当前进程的父PID PPID=$(ps -o ppid= -p $CURRENT_PID | tr -d ' ') # 到达init进程(PID=1)就停止 if [ $PPID -eq 1 ]; then echo "无法找到发起请求的进程" break fi # 获取父进程的名称和完整命令行 PROC_NAME=$(ps -o comm= -p $PPID) PROC_CMD=$(ps -o cmd= -p $PPID) # 排除常见的桌面工具/环境进程(根据你的桌面环境调整) if [[ ! "$PROC_NAME" =~ (xdg-open|gnome-shell|plasma-desktop|xfce4-session|kwin) ]]; then echo "=== 发起请求的进程信息 ===" echo "PID: $PPID" echo "进程名: $PROC_NAME" echo "命令行: $PROC_CMD" echo "请求的URL: $TARGET_URL" break fi CURRENT_PID=$PPID done # 调用真实浏览器打开链接(替换成你常用的浏览器) exec firefox "$TARGET_URL"
注意事项
- 不同桌面环境的进程名不同,比如KDE是
plasma-desktop,GNOME是gnome-shell,XFCE是xfce4-session,你需要根据自己的环境调整排除列表。 - 给脚本添加执行权限:
chmod +x /path/to/your/script.sh
方法2:用auditd监控系统调用(更准确)
如果需要更精准的追踪,尤其是要捕获所有发起网页请求的场景,可以使用auditd工具监控系统的execve调用,它能直接记录发起请求的进程PID和相关参数。
步骤
安装并启动auditd
# Debian/Ubuntu sudo apt install auditd # Fedora/RHEL sudo dnf install auditd # 启动服务 sudo systemctl start auditd sudo systemctl enable auditd添加监控规则
监控所有调用xdg-open的进程(因为应用通常通过它发起网页请求):sudo auditctl -a exit,always -F arch=b64 -S execve -F comm=xdg-open查看监控日志
当有应用发起网页请求时,日志会记录在/var/log/audit/audit.log中。你可以用ausearch过滤相关记录:sudo ausearch -x xdg-open日志中会包含以下关键信息:
pid:xdg-open的PIDppid: 发起xdg-open的应用PID(也就是你要找的源头PID)a1: 请求打开的URL参数
优缺点
- 优点:能精准捕获所有场景,不会遗漏任何发起请求的进程。
- 缺点:需要root权限,日志量可能较大,需要定期清理或过滤。
内容的提问来源于stack exchange,提问作者Ekds7992
相关产品推荐
相关产品推荐

