用python检测进程状态

我们很多时候做客户端爬虫的时候,或者是在Windows上做项目的时候,我们都需要对目标进程进行监控,在目标进程出现异常的时候对我们的爬虫进行相应的异常处理。

当时做这个的时候思路比较局限,可能是因为自己old school风格的原因吧,就想着怎么去做Windows编程,去请求系统的API,后面发现如果是去请求系统的API的话,第一是过程比较复杂,第二是在python方面,对Windows的一些介绍也比较少,像win32,win32api之类的,很多资料都不齐全,因为这些资料很多时候是面对有Windows编程有需要,或是对Windows编程比较有经验的人用的,入门的比较少。

后面搞的时候还是请教了一些大佬,其中一个搞安全的大佬给了一个思路,你试试用安全的角度去考虑这个功能的实现。也要感谢自己当时在安全的路上跌跌撞撞的走过几年吧,这样一样就有了一个解决的思路,虽然比较猥琐,做了一下搬砖的工作,还是比较快解决的。用到了一个名叫psutil的模块。更多的详情,可以参考psutil的github主页psutil,功能还是很多很强大的。

惯例,直接上代码,代码注释非常的清晰。因为这个是工作中用到的一个模块,我用类进行了封装。对于进程名,因为工作问题我隐去了,换成了一个QQ的进程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# -*-coding:utf-8-*-
# _by:lam
import psutil
import time
import sys
class Listen_from_status():
"""
该模块为了解决客户端在爬取数据的时候的进程异常的问题
"""
@staticmethod
def listen():
# name为需要监测进程名
name = 'QQ.exe'
# 获取系统此时所有的进程名字,进程pid,进程开始时间
for proc in psutil.process_iter():
if name in proc.name():
# psutil.Process()这个函数接收一个进程pid作为参数,获取进程的信息,开始时间,进程名等
p = psutil.Process(proc.pid)
# 判断进程的状态
if p.status() == psutil.STATUS_RUNNING:
pass
else:
time.sleep(30)
return
if __name__=='__main__':
Listen_from_status.listen()

psutil中定义的进程的状态有这几种,当然,我们也可以用字符串去代替他的状态情况。状态的字符串就是STATUS_后面的名字换成小写字母即可。()中提示的是适用的系统。

psutil.STATUS_RUNNING

psutil.STATUS_SLEEPING

psutil.STATUS_DISK_SLEEP

psutil.STATUS_STOPPED

psutil.STATUS_TRACING_STOP

psutil.STATUS_ZOMBIE

psutil.STATUS_DEAD

psutil.STATUS_WAKE_KILL

psutil.STATUS_WAKING

psutil.STATUS_IDLE(OSX, FreeBSD)

psutil.STATUS_LOCKED(FreeBSD)

psutil.STATUS_WAITING(FreeBSD)

psutil.STATUS_SUSPENDED(NetBSD

本文地址:http://damiantuan.xyz/2018/04/05/用python检测进程状态/
转载请注明出处,谢谢!

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------