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 个进程,P
和 C
是同一程序的 2 个独立实例。
-
当内核的调度程序决定运行
C
时,它会选择一个CPU,并将该CPU 的堆栈指针、数据指针、代码指针和页表设置为指向C
中的适当地址记忆。
CPU 基本上是运行一个循环的硬件,该循环始终执行下一个代码指针(“指令指针”),因此一旦您将代码指针设置为新代码,它将运行新代码。
C
中的新代码仍然是 P
中旧代码的副本。
-
现在
C
正在运行,它调用execve()
系统调用,这是另一个内核API。
fork()
,然后检查你是原始P
还是克隆C
,如果你是C
,你打电话给execve()
。
-
作为响应,内核创建一个新的内存空间(“地址空间”),其中将包含新程序的堆、堆栈、代码等,将可执行文件加载到该内存中,然后将该新内存声明为“进程”
C
"。
-
(我在这里简化)内核的调度程序然后再次将 CPU 的指针设置为那些
C
- 本质上是“重新调度”它。只有现在那些指向新的内存空间。
当控制权从内核返回到C
时,它现在指向新程序的入口点,最终将调用main()
。
【讨论】:
【参考方案2】:你的程序是由别人而不是你的程序开始的(否则就是鸡蛋和鸡的悖论)。假设您从某个 shell 运行程序,shell 对负责启动新进程的 Linux 内核函数进行内核调用。它启动程序所需的内存空间并调用它的main。现在,每次您的程序需要一些需要 cpl3 的东西时,它都会调用一个内核函数。
【讨论】:
以上是关于python 如何监测进程是不是关闭?的主要内容,如果未能解决你的问题,请参考以下文章
实时监测Tomcat服务的状态,如果关闭,自动开启(已解决)