如何使用 Python 检查 Linux 中正在运行的脚本?

2025年1月5日 | 阅读 7 分钟

在 Linux 系统中,检查特定脚本是否正在运行是常见的需求。这对于监控、确保单实例执行或基于脚本状态执行操作非常有用。Python 提供了多种方法来实现这一点,其中一种是使用 psutil 库。在本指南中,我们将探讨如何使用 psutil 检查 Linux 中正在运行的脚本,以及其他替代方法和最佳实践。

了解 psutil

psutil 是一个 Python 库,它提供了跨平台的接口来查询有关正在运行的进程和系统利用率的信息。它允许我们检索 CPU 利用率、内存利用率、磁盘 I/O 等信息。对于我们的目的,我们将重点关注使用 psutil 查询正在运行的进程并检查特定脚本是否在其中。

方法 1:使用 psutil

在使用 psutil 之前,请确保已安装它。您可以通过 pip 安装它。

示例

这是使用 psutil 检查脚本是否正在运行的方法。

输出

The script my_script.py is running.

说明

提供的 Python 代码片段利用 psutil 模块,这是一个强大的系统监控和进程管理库,用于确定 Linux 平台上特定脚本的运行状态。它包含一个名为 `is_script_running` 的自定义函数,该函数旨在系统地遍历正在运行的进程列表,并将其名称与提供的脚本名称进行匹配。这个比较过程使函数能够有效地确定目标脚本是否当前正在执行。一旦找到具有匹配名称的进程(表明脚本正在运行),该函数将返回布尔值 `True`,确认其执行状态。反之,如果没有找到匹配项,则函数返回 `False`,表示脚本未执行。

这种方法代表了一种实用且简洁的自动检查脚本执行状态的方式,消除了手动干预或依赖外部工具的需要。使用 psutil 模块增强了解决方案的健壮性和适应性,确保了跨不同 Linux 发行版和系统配置的无缝兼容性。

优点

  1. 提供了一种健壮可靠的方法来检查脚本是否正在运行。
  2. 可跨各种 Linux 发行版和环境运行。

缺点

  1. 需要安装 psutil 库。
  2. 对于检查脚本状态来说,这可能不是最有效的方法,尤其是在进程数量非常多的情况下。

方法 2:使用 Shell 命令

或者,您可以在 Python 中使用 Shell 命令来检查脚本是否正在运行。此方法涉及使用 `subprocess` 模块执行 Shell 命令,并解析结果以确定脚本的状态。

示例

这是使用 Shell 命令检查脚本是否正在运行的方法。

输出

The script my_script.py is not running.

说明

提供的 Python 代码片段提供了一种替代方法,用于使用 `subprocess` 模块确定 Linux 系统上特定脚本的运行状态。这种方法允许直接从 Python 脚本内部执行 Shell 命令,为与系统 Shell 环境交互提供了一种灵活的方式。

在代码中,定义了 `is_script_running` 函数,该函数旨在确定具有指定名称的脚本当前是否处于活动状态。该函数使用 f-strings 构建一个 Shell 命令,将提供的 `script_name` 包含在 `pgrep -f` 命令中。`pgrep -f` 命令根据进程的命令行(包括任何参数)进行搜索。

构建 Shell 命令后,使用 `subprocess.run()` 函数执行它。`shell=True` 参数表明命令应该在 Shell 环境中执行,而 `stdout=subprocess.PIPE` 和 `stderr=subprocess.PIPE` 用于分别捕获命令的标准输出和错误流。因此,通过 `subprocess.run()` 返回结果对象的 `returncode` 属性可以访问执行命令的返回代码。返回代码 0 表示 `pgrep` 命令成功找到匹配的进程,表明脚本正在运行。反之,如果未找到匹配的进程,则函数返回 `False`,表示脚本未处于活动状态。

优点

  1. 无需安装额外的 Python 包(假定 `subprocess` 已经可用)。
  2. 在 psutil 不可用或不被青睐的情况下可能很有用。

缺点

  1. 依赖于 Shell 命令,这些命令在不同的 Linux 发行版之间可能有所不同。
  2. 可能不如使用 psutil 健壮或方便。
  3. 解析 Shell 命令结果可能容易出错,并且不如直接使用 Python 库高效。

最佳实践和注意事项

效率

效率至关重要,尤其是在处理大量进程时。选择一种能最大限度地减少资源利用和执行时间的方法。例如:

  1. 避免繁重的操作:使用高效的算法和数据结构来最大限度地减少处理时间。
  2. 批量处理:如果可能,对进程查询进行批量处理以减少开销。
  3. 优化库:选择为性能而优化的库或方法,例如 psutil。

错误处理

适当的错误处理可确保健壮性并防止意外行为。请考虑以下事项:

  1. 输入验证:验证输入参数(例如脚本名称),以防止因无效输入而导致的错误。
  2. 异常处理:以优雅的方式捕获和处理异常,以防止崩溃并提供信息性的错误消息。
  3. 日志记录:记录错误消息和相关信息,以便进行故障排除和调试。

Permission

根据系统的配置和安全策略,访问进程信息可能需要适当的权限。以下是要记住的事项:

  1. 用户权限:确保脚本具有访问进程信息的足够权限。
  2. 提升的权限:如果需要,以提升的权限(例如管理员身份)运行脚本以访问受限的进程信息。
  3. 安全注意事项:在请求提升的权限时,要注意安全影响,并遵循安全最佳实践。

可移植性

如果脚本需要在多个平台上运行,请考虑使用 psutil 等跨平台库以确保一致性和兼容性。以下是实现可移植性的方法:

  1. 跨平台库:选择支持不同操作系统以确保跨平台行为一致的库。
  2. 平台特定处理:如果使用平台特定方法,请为不支持该方法的平台提供备选方案或替代方案。
  3. 跨平台测试:在不同平台上测试脚本,以识别和解决任何平台特定问题。

资源使用

注意资源使用情况,尤其是在查询长时间运行应用程序的进程信息时。请考虑以下策略:

  1. 资源监控:监控资源使用情况,例如 CPU 和内存使用情况,以识别任何异常或性能瓶颈。
  2. 优化:优化查询和资源密集型操作,以最大限度地减少资源使用。
  3. 定期检查:考虑进行定期检查而不是持续监控,以在空闲期间减少资源使用。

应用

在 Linux 中使用 Python 检查脚本是否正在运行的功能在不同领域有多种应用。以下是一些示例:

  1. 系统监控和自动化:在系统监控应用程序中,您可以使用此功能来确保关键脚本按预期运行。如果脚本意外停止,您可以触发警报或自动恢复操作。
  2. 单实例强制执行:对于应该一次只运行一个实例的脚本(例如备份脚本或守护进程),您可以使用脚本状态检查来同时防止多个实例运行。
  3. 资源管理:通过检查资源密集型脚本或进程的运行状态,您可以优化资源分配并确保高效的资源利用。
  4. 任务调度:在任务调度系统中,您可以在启动其他实例之前检查计划的脚本是否当前正在运行,从而防止冲突和资源争用。
  5. 服务运行状况检查:在分布式系统或微服务架构中,您可以定期检查关键服务或脚本是否正在运行,以确保服务的可用性和可靠性。
  6. 进程管理:对于依赖于多个相互关联的脚本或进程的应用程序,您可以使用脚本状态检查来协调进程执行和管理依赖关系。
  7. 安全监控:脚本状态检查可以与安全监控系统集成,以检测未经授权或可疑的脚本执行,从而有助于识别潜在的安全漏洞或恶意活动。
  8. 脚本版本控制:通过跟踪不同脚本版本的运行状态,您可以确保一致的行为并有效地识别脚本执行中的错误或异常。