在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检测lvs real server状态
Jan 22 Python
Python中Django发送带图片和附件的邮件
Mar 31 Python
利用python求相邻数的方法示例
Aug 18 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
Python中字符串与编码示例代码
May 20 Python
Appium+python自动化怎么查看程序所占端口号和IP
Jun 14 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
centos7之Python3.74安装教程
Aug 15 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 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的概念
2006/10/09 PHP
一个简单的PHP&amp;MYSQL留言板源码
2020/07/19 PHP
php缓存技术详细总结
2013/08/07 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
asp.net和php的区别点总结
2019/10/10 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
老生常谈js数据类型
2017/08/03 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
Python 详解基本语法_函数_返回值
2017/01/22 Python
Python中表示字符串的三种方法
2017/09/06 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
成教毕业生自我鉴定
2013/10/23 职场文书
简历的自荐信
2013/12/19 职场文书
十佳大学生村官事迹
2014/01/09 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
公司员工管理制度
2015/08/04 职场文书
python爬虫selenium模块详解
2021/03/30 Python