You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过名称查询运行中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:12:02