Python原生实现pkill -f按进程名杀进程无需subprocess或第三方依赖
实现方案
你使用的是Linux(Ubuntu 18.04)系统,可直接通过读取系统原生的/proc进程文件系统实现需求,全程只用到Python标准库,无需调用subprocess也无需安装第三方依赖,逻辑和pkill -f完全一致:匹配进程完整启动命令行的子串,命中后终止进程。
完整代码实现
import os import signal def pkill_f(pattern: str, sig: int = signal.SIGTERM) -> None: """ 实现和pkill -f等价的功能:匹配命令行包含指定子串的进程,发送指定信号 :param pattern: 要匹配的命令行子串 :param sig: 要发送的信号,默认SIGTERM(等价pkill默认行为),可传signal.SIGKILL强制终止 """ # 遍历/proc下的所有条目,筛选出PID对应的数字命名目录 for entry in os.listdir('/proc'): if not entry.isdigit(): continue pid = int(entry) try: # 读取进程的完整启动命令行,cmdline中参数用\x00分隔 with open(f'/proc/{pid}/cmdline', 'r') as f: cmdline = f.read().replace('\x00', ' ').strip() # 子串匹配,和pkill -f逻辑一致 # 如需避免终止当前Python脚本自身,可追加 and pid != os.getpid() 条件 if pattern in cmdline: os.kill(pid, sig) # 跳过遍历过程中已退出的进程、无权限访问的进程 except (ProcessLookupError, PermissionError, FileNotFoundError): continue
使用示例
要终止所有命令行包含process_name的进程,直接调用即可:
pkill_f("process_name")
如果需要强制杀进程(等价pkill -9 -f process_name),可以传SIGKILL信号:
pkill_f("process_name", sig=signal.SIGKILL)
注意事项
- 该方案仅适用于Linux系统,刚好匹配你的Ubuntu 18.04运行环境
- 仅能终止当前执行Python脚本的用户有权限操作的进程,和
pkill的权限逻辑完全一致 - 匹配逻辑和
pkill -f完全相同,是对进程的完整启动命令行做子串匹配,而非仅匹配进程名
内容的提问来源于stack exchange,提问作者Pranjal Doshi
相关产品推荐
相关产品推荐

