用python查看运行进程(在Python运行时动态查看进程内部信息的方法)
用python查看运行进程
在Python运行时动态查看进程内部信息的方法接前两篇“运行时查看线程信息”的博客,我在想,既然我可以随时打印线程信息,那么我是不是可以随时打印进程内部的其它信息呢?比如,实时查看一些对象属性等,这样可以帮助我们在不重新启动应用程序的情况下就可以观察进程的执行状态。(这里暂时不考虑那些使用第三方库或工具的情况)
根据这个想法,查看了一下python的动态加载模块的方法,感觉这个想法还是比较靠谱,应该可以实现,所以动手写了个小测试验证了一把。(这里说明一下,只是验证性的,生产环境要使用的话,还是有不少问题需要考虑的。)
下面就是测试时考虑要做到的
- 还是使用 SIGQUIT 信号即“kill -3”来触发执行打印进程内部对象属性.
- foo.py主程序,包括注册信号处理函数,创建一个全局的对象用来保存一些属性,启动一个线程让主线程不退出。
- foo.py主程序中的信号处理函数动态加载一个指定路径的下的模块,这里我们就假定这个模块路径是”/tmp/my_modules”,可以根据需要修改。然后调用这个模块中的方法来打印一些进程信息。
- /tmp/my_modules/bar.py需要动态加载的模块,其中访问foo模块中的一个对象,并打印对象属性。
- 要能随时动态修改要查看的进程状态,即在不重启进程的情况下,通过修改bar.py文件修改要实现查看的内容。
主程序 foo.py
|
#!/usr/bin/env /usr/bin/python3.4 # -*- coding: utf-8 -*- import sys import threading import signal from datetime import datetime import time class MyObject( object ): def __init__( self ): self .data = {} self .data[ 'a' ] = 'aaa' self .data[ 'b' ] = 'bbb' self .data[ 'c' ] = 'ccc' def test(): while True : print (datetime.now()) time.sleep( 2 ) # 信号处理函数 def signal_handler(signum, frame): try : # 动态加载模块 sys.path.append( "/tmp/my_modules" ) # 导入bar模块 bar = __import__ ( 'bar' ) # 重新加载模块,为的是可以随时重新加载模块 reload (bar) # 调用动态加载模块的方法 bar.execute() except BaseException as e: print (e) my_object = MyObject() if __name__ = = "__main__" : try : signal.signal(signal.SIGQUIT, signal_handler) threading.Thread(target = test).start() while True : time.sleep( 60 ) except KeyboardInterrupt: sys.exit( 1 ) |
需要动态加载的模块 /tmp/my_modules/bar.py
|
#!/usr/bin/env /usr/bin/python3.4 # -*- coding: utf-8 -*- import foo def execute(): # 打印foo模块中的对象 print "my_object: %s " % foo.my_object.data |
测试
首先运行foo.py
|
$ python foo.py |
然后找到foo.py的进程号,然后使用“kill -3”来触发打印内存对象的方法
|
$ kill - 3 <pid> |
此时应该可以看到foo.py进程打印my_object的属性。
修改一下 /tmp/my_modules/bar.py 文件,然后再次运行“$ kill -3 ”,可以看到模块被重新加载了,然后打印的新的内容。
以上这篇在Python运行时动态查看进程内部信息的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/kongxx/article/details/80073721
- SQL Server中查看未释放的游标
- docker如何查看容器目录(docker 查看容器的挂载目录操作)
- git查看一共提交的代码(Git提交日志修改方法实例汇总)
- linux 长模式查看文件(linux 查看文件系统类型实例方法)
- docker 查看当前镜像(Docker 查看镜像信息的方法)
- 如何看云服务器日志(云服务器怎么查看日志的步骤)
- 如何查看python是否安装selenium(selenium+python截图不成功的解决方法)
- docker查看管理配置信息(Docker Secret的管理和使用详解)
- sql server查看之前的代码(SQL Server简单实现数据的日报和月报功能)
- linux中apache是否启动怎么查看(Linux apache取消300错误页面Multiple Choices简单步骤)
- 怎么查看自己搭建的ftp服务器(你懂怎么建立 FTP 服务器么?)
- 查看linux服务器开放哪些端口(详解Linux服务器最多能开放多少个端口)
- 查看SQL SERVER中指定数据库所有表的字段信息
- mysql索引提高效率(MySql如何查看索引并实现优化)
- 查看腾讯云服务器端口(腾讯云服务器解封25端口图文教程)
- explain语句详解(聊聊explain查看执行计划)
- 二胎家庭老大爱闹情绪,用这招很有效(二胎家庭老大爱闹情绪)
- 一个30岁男人外遇失败的全过程(一个30岁男人外遇失败的全过程)
- 《无敌破坏王2》 不聊彩蛋,聊聊我从动画里看到的现实那些事儿(无敌破坏王2不聊彩蛋)
- 《寄生虫》 三观不正 人类悲欢从来不相通,感同身受也并非本能(寄生虫三观不正)
- 这部动漫中的女孩子,可比101女孩更加励志(这部动漫中的女孩子)
- 《白狐的人生》热拍 贾征宇偶像包袱难自弃 图(白狐的人生热拍)
热门推荐
- html5canvas怎么改扇形起始角(HTML5 Canvas实现放大镜效果示例)
- IIS假死的原因
- python定时任务详解(使用Python做定时任务及时了解互联网动态)
- pythonweb大数据分析(Python实现的大数据分析操作系统日志功能示例)
- serv-u界面怎么设置中文(Serv-U 550 Permission denied 的解决办法)
- css3控制效果过渡的属性(css3之UI元素状态伪类选择器实例演示)
- vue 父组件传值(Vue两个同级组件传值实现)
- php开发技巧和方法(php+ajax实现商品对比功能示例)
- 数据库常见的索引结构(数据库索引知识点整理)
- laravel命令控制器怎么设置(Laravel获取当前请求的控制器和方法以及中间件的例子)