在 Linux 系统中,检查一个 Python 进程是否存在,有多种方法,从简单到复杂,适用于不同的场景,下面我将为你详细介绍这些方法。

使用 ps 命令 (最常用)
ps (process status) 命令是查看系统中正在运行的进程的强大工具。
基础用法
你可以使用 ps 命令列出所有进程,然后通过 grep 过滤出包含 "python" 的行。
ps aux | grep python
命令解释:
ps aux: 显示所有进程的详细信息。a: 显示所有终端的进程。u: 以用户为中心显示进程。x: 显示通常不在终端上运行的进程(如守护进程)。
- 管道,将
ps aux的输出作为grep的输入。 grep python: 搜索包含 "python" 字符串的行。
示例输出:

user 1234 0.0 0.1 12345 6780 pts/0 S+ 10:30 0:00 python my_script.py
user 5678 0.0 0.0 9876 543 pts/1 S+ 10:31 0:00 grep --color=auto python
注意: grep 命令本身也会出现在结果中,因为它也是一个正在运行的进程,你可以使用 grep -v grep 来排除它:
ps aux | grep python | grep -v grep
更精确的匹配
如果你的进程名是 python,但你只想找你的特定脚本,可以加上脚本名:
ps aux | grep "python my_script.py"
只显示进程ID (PID)
如果你只需要进程的 ID (PID),以便在脚本中使用,可以使用 awk 来提取:
# 获取所有 python 进程的 PID,每行一个
ps aux | grep python | grep -v grep | awk '{print $2}'
# 如果你确定只有一个目标进程,可以这样获取它的 PID
PID=$(ps aux | grep "python my_script.py" | grep -v grep | awk '{print $2}')
echo $PID
使用 pgrep 命令 (更简洁)
pgrep (process grep) 是专门为根据名称查找进程 ID 而设计的,比 ps | grep 更简单、更高效。

查找所有名为 "python" 的进程的 PID
pgrep python
如果存在,它会直接输出 PID(一个或多个);如果不存在,则不输出任何内容。
查找特定用户运行的 Python 进程
pgrep -u username python
查找完整的命令行匹配
pgrep 默认只匹配进程名,如果你想匹配完整的命令行(python my_script.py),需要使用 -f 选项。
pgrep -f "python my_script.py"
这是 推荐 的方式,因为它能更精确地定位到你想要的进程。
在 Python 脚本中检查 (自动化场景)
当你需要在另一个 Python 脚本中检查某个进程是否存在时,可以使用 subprocess 模块调用系统命令,并结合 os 模块。
示例:检查 my_script.py 是否在运行
import subprocess
import os
def is_process_running(process_name):
"""
检查指定进程是否正在运行。
:param process_name: 要检查的进程名或命令行的一部分 (e.g., "python my_script.py")
:return: 如果进程存在返回 True,否则返回 False
"""
try:
# 使用 pgrep 命令,-f 表示匹配完整的命令行
# shell=True 是必需的,因为我们在管道中使用 grep
cmd = f"pgrep -f '{process_name}'"
# subprocess.check_output 会执行命令,如果命令返回非零状态码(即没找到进程),则会抛出 CalledProcessError
subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
# 如果命令成功执行(没有抛出异常),说明进程存在
return True
except subprocess.CalledProcessError:
# pgrep 没有找到匹配的进程,返回非零状态码,因此会进入这里
return False
except Exception as e:
# 其他可能的错误(如命令不存在)
print(f"An error occurred: {e}")
return False
# --- 使用示例 ---
target_process = "python my_script.py"
if is_process_running(target_process):
print(f"进程 '{target_process}' 正在运行。")
else:
print(f"进程 '{target_process}' 没有运行。")
# 你也可以启动一个进程来测试
# import time
# print("启动一个测试进程...")
# os.system("python3 -c 'import time; time.sleep(10)' &")
# time.sleep(1) # 给进程一点启动时间
# is_process_running("python3 -c 'import time; time.sleep(10)'") # 应该返回 True
检查特定端口是否被占用 (间接方法)
如果你的 Python 进程是一个网络服务(如 Web 服务器),你可以通过检查它监听的端口来判断它是否存在。
使用 lsof (list open files) 命令
lsof 可以列出打开的文件,当然也包括网络端口。
# 检查 8000 端口是否被占用 lsof -i :8000
如果端口被占用,它会显示占用该端口的进程信息,包括 PID 和进程名。
使用 netstat 命令
# 检查 8000 端口 netstat -tuln | grep :8000
-t: TCP 端口-u: UDP 端口-l: 只显示监听端口-n: 以数字形式显示地址和端口,不进行 DNS 解析,速度更快。
总结与推荐
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 手动快速检查 | ps aux \| grep python |
直观,信息全面 | 需要手动过滤 grep 自身 |
| 脚本中获取 PID | pgrep python |
简洁,直接返回 PID | 默认不匹配完整命令行 |
| 脚本中精确匹配 | pgrep -f "python my_script.py" |
最推荐,精确、高效 | 无明显缺点 |
| Python 脚本自动化 | subprocess + pgrep -f |
功能强大,可集成到任何 Python 程序 | 需要编写少量代码 |
| 检查网络服务 | lsof -i :port 或 netstat |
适用于网络应用 | 只能检查监听端口的进程 |
核心建议:
- 日常手动检查:
ps aux | grep python - 在 Shell 脚本中检查是否存在:
pgrep -f "your_command" > /dev/null && echo "Running" || echo "Not running" - 在 Python 脚本中检查: 使用
subprocess模块调用pgrep -f,如上面示例所示,这是最可靠和 Pythonic 的方式。
