杰瑞科技汇

如何判断Linux中Python进程是否存在?

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

如何判断Linux中Python进程是否存在?-图1
(图片来源网络,侵删)

使用 ps 命令 (最常用)

ps (process status) 命令是查看系统中正在运行的进程的强大工具。

基础用法

你可以使用 ps 命令列出所有进程,然后通过 grep 过滤出包含 "python" 的行。

ps aux | grep python

命令解释:

  • ps aux: 显示所有进程的详细信息。
    • a: 显示所有终端的进程。
    • u: 以用户为中心显示进程。
    • x: 显示通常不在终端上运行的进程(如守护进程)。
  • 管道,将 ps aux 的输出作为 grep 的输入。
  • grep python: 搜索包含 "python" 字符串的行。

示例输出:

如何判断Linux中Python进程是否存在?-图2
(图片来源网络,侵删)
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 更简单、更高效。

如何判断Linux中Python进程是否存在?-图3
(图片来源网络,侵删)

查找所有名为 "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 :portnetstat 适用于网络应用 只能检查监听端口的进程

核心建议:

  • 日常手动检查: ps aux | grep python
  • 在 Shell 脚本中检查是否存在: pgrep -f "your_command" > /dev/null && echo "Running" || echo "Not running"
  • 在 Python 脚本中检查: 使用 subprocess 模块调用 pgrep -f,如上面示例所示,这是最可靠和 Pythonic 的方式。
分享:
扫描分享到社交APP
上一篇
下一篇