在Python运行时动态查看进程内部信息的方法


Posted in Python onFebruary 22, 2019

接前两篇“运行时查看线程信息”的博客,我在想,既然我可以随时打印线程信息,那么我是不是可以随时打印进程内部的其它信息呢?比如,实时查看一些对象属性等,这样可以帮助我们在不重新启动应用程序的情况下就可以观察进程的执行状态。(这里暂时不考虑那些使用第三方库或工具的情况)

根据这个想法,查看了一下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运行时动态查看进程内部信息的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 Python
使用Python读取安卓手机的屏幕分辨率方法
Mar 31 Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
python+Splinter实现12306抢票功能
Sep 25 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
pycharm 更改创建文件默认路径的操作
Feb 15 Python
Pytorch环境搭建与基本语法
Jun 03 Python
Python接口测试环境搭建过程详解
Jun 29 Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 Python
Python开启线程,在函数中开线程的实例
Feb 22 #Python
python 多线程串行和并行的实例
Feb 22 #Python
Python OOP类中的几种函数或方法总结
Feb 22 #Python
VSCode Python开发环境配置的详细步骤
Feb 22 #Python
python中logging模块的一些简单用法的使用
Feb 22 #Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 #Python
Python3.6.x中内置函数总结及讲解
Feb 22 #Python
You might like
PHP中session变量的销毁
2014/02/27 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
php中array_fill函数的实例用法
2021/03/02 PHP
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
vue中tab选项卡的实现思路
2018/11/25 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
python中元类用法实例
2014/10/10 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python 实现敏感词过滤的方法
2019/01/21 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
Python多线程正确用法实例解析
2020/05/30 Python
结合 CSS3 transition transform 实现简单的跑马灯效果的示例
2018/02/07 HTML / CSS
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
中医临床专业自我鉴定范文
2014/01/15 职场文书
高二政治教学反思
2014/02/01 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL
python字典进行运算原理及实例分享
2021/08/02 Python
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript