用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
- 查sqlserver锁表语句(Sql Server如何查看被锁的表及解锁的方法)
- 腾讯云查看ftp用户名密码(腾讯云服务器ftp连不上的解决办法)
- 查看SQL SERVER中指定数据库所有表的字段信息
- sqlserver查看创建的索引(浅述SQL Server的聚焦强制索引查询条件和Columnstore Index)
- docker-compose查看服务状态(Docker+DockerCompose封装web应用的方法步骤)
- 如何查看linq生成的sql
- 如何查看sql语句执行时间
- tomcat服务如何在eclipse中配置(HBuilderX配置tomcat外部服务器查看编辑jsp界面的方法详解)
- 查看腾讯云服务器端口(腾讯云服务器解封25端口图文教程)
- linux系统查看nginx系统版本(Linux中Nginx的防盗链和优化的实现代码)
- git查看一共提交的代码(Git提交日志修改方法实例汇总)
- docker查看挂载目录(docker-修改容器挂载目录的3种方法小结)
- sql server查看之前的代码(SQL Server简单实现数据的日报和月报功能)
- sqlserver查看某个库所有表(SQL Server怎么找出一个表包含的页信息Page)
- mysql中使用show table status 查看表信息
- 怎么查看云服务器的配置(云服务器配置参数如何选择)
- 有种尴尬叫朋友圈忘屏蔽,大学生上演社死现场,父母亲自下场吐槽(有种尴尬叫朋友圈忘屏蔽)
- 朋友圈屏蔽你的人,可以直接看淡了(朋友圈屏蔽你的人)
- 金球奖只青睐那些会戴珠宝的女人(金球奖只青睐那些会戴珠宝的女人)
- 浙江省一个县,人口超40万,建县历史超1100年(浙江省一个县人口超40万)
- 五代十国南唐历代国君(五代十国南唐历代国君)
- 飞机引进工程师杨隆 匠人匠心,只争朝夕(飞机引进工程师杨隆)
热门推荐
- python找到连续不重复最长英文串(Python实现简单查找最长子串功能示例)
- vue 排班安排(vue实现钉钉的考勤日历)
- CSS中Position 的用法
- nginx优化安全设置(nginx优化的六点方法)
- windows10怎么设置iis框架(Windows10系统如何安装IIS服务器)
- sql server语法大全(SQL Server 全文搜索功能介绍)
- 微信开发接口文档地址
- thinkphp3.2.3 接口开发(ThinkPHP3.2.3框架Memcache缓存使用方法实例总结)
- C#中==、Equals、ReferenceEquals的区别
- vuejs全家桶入门教程交流(Vue全家桶入门基础教程)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9