python 如何监测进程是不是关闭?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 如何监测进程是不是关闭?相关的知识,希望对你有一定的参考价值。

有个软件处理完数据后就会自动关闭,我如何一直监测这软件是否关闭了呢?我想到的是监测它的进程,进程我也读取的到,但我该如何循环的监测呢。

如果被监测程序是你自己编写的,那你可以在程序进程结束的时候主动去通知监测进程。

如果不是,而你要监测它的运行情况,那么这和操作系统有关。Windows和Linux下的处理方式是不一样的。追问

是Windows下的,这软件什么时候关闭是不确定的。所以也不知道什么时候去主动通知,我想的是软件在运行阶段就一直循环监测进程,就是这循环不知道怎么写?求教。

追答

如果你是用子进程的方式启动的被监测程序,那么你可以用poll()或者wait()来等待子进程结束。

proc = subprocess.Popen([参数列表])
while proc.poll() is not None:
    sleep(1)  # 轮询子进程是否结束,没有则等待一秒

参考技术A 涉及跨进程通讯的解决方案很多,最直接的可以用socket在监控和被监控进程搭建心跳传输,一旦发现目标socket没有正常返回心跳就说明已经退出了。如果有多个进程要监控,用mqtt来发心跳也方便。

进程是如何在处理器中创建的? [关闭]

【中文标题】进程是如何在处理器中创建的? [关闭]【英文标题】:How a process is created in a processor? [closed] 【发布时间】:2021-03-17 06:48:05 【问题描述】:

当我在 unix/Linux 中执行一个程序时,底层到底发生了什么?

谁负责创建流程?

我是否需要调用内核来启动一个进程(我的程序实例)?从这个意义上说,我的程序应该在处理器上运行以进行内核调用,对吗?那么第一个内核调用是如何发生在进程启动的呢? .是不是像死锁一样?那么内核首先出现在哪里呢?

对不起,我刚刚阅读了很多关于所有这些的文档,但仍然无法连接这些点或获得完整的图片。有人可以详细说明一下简单的术语吗?

【问题讨论】:

【参考方案1】:

在 Unix 系统(以及大多数现代非 Unix 系统)上,进程是一棵树 - 每个进程都有一个父进程(进程 ID 为 1 的进程除外,即 init 进程,它由内核在启动)。

当您登录系统时,您通常会登录到“shell”程序的实例(程序 = 可执行文件,shell = 用户交互)。在 Windows 上,Explorer.exe 是外壳。在 Unix 系统上,传统上你的 shell 类似于bash。在 Linux 桌面上,你有一个像 Gnome 这样的图形环境,它是你的 shell,你可以使用它来运行像 gnome-terminal 这样的程序,它恰好运行另一个程序,然后恰好是一个基于文本的 shell,比如 bash 而不是图形外壳。

无论您是从 Gnome、bash 还是从任何其他程序 P 运行程序,无论是否交互,P 都是您的进程的父进程,我们将其称为 C,并且所以P 是启动C 创建的过程。

它在 Unix 中的工作方式,通常如下:

    P 实际上在某个 CPU 上运行。 P 调用 fork() 系统调用,这是一个内核 API。 作为响应,内核创建进程P 的副本作为新进程C
此时,C 未在任何 CPU 上运行。 现在您有 2 个进程,PC 是同一程序的 2 个独立实例。
    当内核的调度程序决定运行C 时,它会选择一个CPU,并将该CPU 的堆栈指针、数据指针、代码指针和页表设置为指向C 中的适当地址记忆。 CPU 基本上是运行一个循环的硬件,该循环始终执行下一个代码指针(“指令指针”),因此一旦您将代码指针设置为新代码,它将运行新代码。
请注意,C 中的新代码仍然是 P 中旧代码的副本。
    现在C 正在运行,它调用execve() 系统调用,这是另一个内核API。
这是启动程序的父进程逻辑的一部分——你调用fork(),然后检查你是原始P还是克隆C,如果你是C ,你打电话给execve()
    作为响应,内核创建一个新的内存空间(“地址空间”),其中将包含新程序的堆、堆栈、代码等,将可执行文件加载到该内存中,然后将该新内存声明为“进程” C"。
将可执行文件加载到内存中的一部分是创建 CPU 最终可以指向的堆栈指针、数据指针、代码指针和页表的新适当地址。 特别是,代码指针的地址是新程序入口点的地址。
    (我在这里简化)内核的调度程序然后再次将 CPU 的指针设置为那些C - 本质上是“重新调度”它。只有现在那些指向新的内存空间。 当控制权从内核返回到C 时,它现在指向新程序的入口点,最终将调用main()

【讨论】:

【参考方案2】:

你的程序是由别人而不是你的程序开始的(否则就是鸡蛋和鸡的悖论)。假设您从某个 shell 运行程序,shell 对负责启动新进程的 Linux 内核函数进行内核调用。它启动程序所需的内存空间并调用它的main。现在,每次您的程序需要一些需要 cpl3 的东西时,它都会调用一个内核函数。

【讨论】:

以上是关于python 如何监测进程是不是关闭?的主要内容,如果未能解决你的问题,请参考以下文章

windows下批处理实现进程监测,防止进程自动关闭

实时监测Tomcat服务的状态,如果关闭,自动开启(已解决)

Python:QMainWindow 对话框关闭后如何关闭(或退出)Python 进程

如何检查正在运行的进程是不是是后台进程? [关闭]

如何使用 Python 关闭终端? [复制]

如何使用 python 通过子进程与 Excel 文件进行通信? [关闭]