如何通过名称查询运行中Python脚本的PID并解决psutil查询无返回问题
问题原因
psutil 的 process.name 属性返回的是进程对应的可执行文件名称,你的 r5bot.py 是 Python 解释器的执行参数,不是可执行文件本身,所以进程的 name 实际是 python 或 python3,自然匹配不到r5bot.py。
正确的PID查询代码
你需要从进程的命令行参数中匹配脚本名称,同时要兼容权限不足、僵尸进程等异常场景:
import psutil import os target_script = "r5bot.py" process_pids = [] for proc in psutil.process_iter(["pid", "cmdline"]): try: cmdline = proc.cmdline() # 排除cmdline为空的进程,校验脚本文件名完全匹配 if len(cmdline) >=2 and os.path.basename(cmdline[1]) == target_script: process_pids.append(proc.pid) except (psutil.AccessDenied, psutil.ZombieProcess, IndexError): # 跳过无权限访问、已僵死、参数为空的进程 continue print(process_pids)
启停功能实现
终止脚本逻辑
收到!kill bot指令时,遍历查询到的PID发送终止信号即可:
import signal for pid in process_pids: os.kill(pid, signal.SIGTERM)
如果遇到无法终止的进程,可以把SIGTERM换成SIGKILL强制杀死。
启动脚本逻辑
收到!start bot指令时,通过subprocess启动nohup后台任务:
import subprocess # 注意替换为你实际的Python解释器路径(如果用虚拟环境要写虚拟环境的python路径) python_path = "python3" subprocess.Popen( ["nohup", python_path, "r5bot.py"], stdout=open("nohup_r5bot.log", "a"), stderr=subprocess.STDOUT, preexec_fn=os.setpgrp )
注意事项
- 运行Discord机器人的系统用户需要和运行
r5bot.py的用户一致,否则会出现权限不足无法查询、杀进程的问题 - 启动脚本时如果查询到已经存在对应PID,可以直接返回「脚本已在运行」的提示,避免重复启动
- 如果需要更稳定的进程托管,可以改用systemd服务管理
r5bot.py,直接通过systemctl start/stop r5bot命令操作,不需要手动查PID
内容的提问来源于stack exchange,提问作者Korladis Bhadwa
相关产品推荐
相关产品推荐

