必须用readlink -f /proc/pid/exe获取真实路径,再依底包类型执行dpkg -s(debian系)或rpm -qf(rhel系)反查所属软件包;若为脚本进程,需先定位解释器归属,再通过/proc/pid/cmdline提取主模块路径二次查询。

在银河麒麟系统中排查进程来源时,若发现一个陌生PID(如12847)正在持续占用CPU或网络,但无法从进程名(如“agent”“helper”“svc”)判断它来自哪个安装的软件包,就必须回溯其二进制文件归属——这一步是定位恶意残留、清理冗余服务或验证信创软件合规性的关键前提。
用dpkg -S反查可执行文件所属软件包
这是最直接可靠的方法,适用于Debian/Ubuntu系底包的银河麒麟V10 SP1及后续版本(如Kylin-Desktop-V10-SP1-U23),要求进程对应的可执行文件路径明确且未被删改。
第一步:通过/proc获取该进程的真实启动路径。执行:readlink -f /proc/<strong>【PID】</strong>/exe,将【PID】替换为实际数字(例如12847),输出类似/usr/bin/python3.9或/opt/tongda/oa/bin/tdoa_agent的绝对路径。
第二步:用dpkg -S查询该路径归属的deb包。执行:dpkg -S <strong>【real_path】</strong>,例如dpkg -S /usr/bin/filezilla,正常返回形如filezilla: /usr/bin/filezilla——冒号前即为软件包名。
若提示“no path found”,说明该文件不是通过apt/dpkg安装的,而是手动编译、tar解压或rpm安装(此时需换用rpm -qf);若提示“command not found”,先运行sudo apt install dpkg补全工具。
用rpm -qf反查RPM包来源(适用于SP3等RHEL系镜像)
银河麒麟V10 SP3、SP4等基于openEuler或CentOS兼容底包的版本默认使用rpm包管理,dpkg不可用,必须切换命令体系。
方法一:确认进程真实路径后直接查包。执行:rpm -qf <strong>【real_path】</strong>,例如rpm -qf /usr/libexec/accounts-daemon,成功则返回accountsservice-0.6.55-5.ky10这类带版本号的包名。
方法二:若进程已退出但仍有残留文件(如日志目录下的守护程序),可对相关路径批量探测。执行:for f in /usr/bin/* /opt/*/*bin/*; do rpm -qf "$f" 2>/dev/null | grep -q '.' && echo "$f → $(rpm -qf "$f")"; done | head -n 5——该命令仅扫描常见bin路径,避免遍历全系统拖慢响应。
注意:rpm -qf对符号链接无效,必须传入readlink -f解析后的物理路径,否则返回“file … is not owned by any package”。
当进程由脚本启动时,需逐层追溯解释器与主模块
很多国产办公套件、信创中间件采用Python/Shell脚本封装,/proc/PID/exe指向的是python或bash,而非真正业务程序,此时dpkg/rpm查不到目标包。
第一步:确认解释器是否为系统包管理安装。执行:dpkg -S $(readlink -f /proc/<strong>【PID】</strong>/exe) 2>/dev/null || rpm -qf $(readlink -f /proc/<strong>【PID】</strong>/exe),先锁定python/bash本身归属。
第二步:提取脚本实际加载的主模块路径。执行:cat /proc/<strong>【PID】</strong>/cmdline | tr '\0' '\n' | grep -E "\.py$|/lib/|/share/" | head -n 1,该命令过滤出含.py扩展名或典型软件路径特征的参数,例如输出/opt/wps-office/ksolauncher.py。
第三步:对上步结果再次执行dpkg -S或rpm -qf。若仍无结果,说明该软件为离线安装的tar.gz包或自打包AppImage,不属于系统包管理体系——此时应检查/var/log/installer/或~/.local/share/applications/下的安装记录。











