Python運行時動態(tài)查看進程內(nèi)部信息

接前兩篇“運行時查看線程信息”的博客,我在想,既然我可以隨時打印線程信息,那么我是不是可以隨時打印進程內(nèi)部的其它信息呢?比如,實時查看一些對象屬性等,這樣可以幫助我們在不重新啟動應(yīng)用程序的情況下就可以觀察進程的執(zhí)行狀態(tài)。(這里暫時不考慮那些使用第三方庫或工具的情況)

根據(jù)這個想法,查看了一下python的動態(tài)加載模塊的方法,感覺這個想法還是比較靠譜,應(yīng)該可以實現(xiàn),所以動手寫了個小測試驗證了一把。(這里說明一下,只是驗證性的,生產(chǎn)環(huán)境要使用的話,還是有不少問題需要考慮的。)

下面就是測試時考慮要做到的

  • 還是使用 SIGQUIT 信號即“kill -3”來觸發(fā)執(zhí)行打印進程內(nèi)部對象屬性.
  • foo.py主程序,包括注冊信號處理函數(shù),創(chuàng)建一個全局的對象用來保存一些屬性,啟動一個線程讓主線程不退出。
  • foo.py主程序中的信號處理函數(shù)動態(tài)加載一個指定路徑的下的模塊,這里我們就假定這個模塊路徑是"/tmp/my_modules",可以根據(jù)需要修改。然后調(diào)用這個模塊中的方法來打印一些進程信息。
  • /tmp/my_modules/bar.py需要動態(tài)加載的模塊,其中訪問foo模塊中的一個對象,并打印對象屬性。
  • 要能隨時動態(tài)修改要查看的進程狀態(tài),即在不重啟進程的情況下,通過修改bar.py文件修改要實現(xiàn)查看的內(nèi)容。

主程序 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)

# 信號處理函數(shù)
def signal_handler(signum, frame):
    try:
        # 動態(tài)加載模塊
        sys.path.append("/tmp/my_modules")

        # 導入bar模塊
        bar = __import__('bar')

        # 重新加載模塊,為的是可以隨時重新加載模塊
        reload(bar)

        # 調(diào)用動態(tài)加載模塊的方法
        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)

需要動態(tài)加載的模塊 /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”來觸發(fā)打印內(nèi)存對象的方法

$ kill -3 <pid>

此時應(yīng)該可以看到foo.py進程打印my_object的屬性。

修改一下 /tmp/my_modules/bar.py 文件,然后再次運行“$ kill -3 <pid>”,可以看到模塊被重新加載了,然后打印的新的內(nèi)容。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 模塊和包 一 模塊 1 什么是模塊? 常見的場景:一個模塊就是一個包含了python定義和聲明的文件,文件名就是...
    go以恒閱讀 2,345評論 0 4
  • Distutils可以用來在Python環(huán)境中構(gòu)建和安裝額外的模塊。新的模塊可以是純Python的,也可以...
    MiracleJQ閱讀 3,247評論 0 1
  • 1.元類 1.1.1類也是對象 在大多數(shù)編程語言中,類就是一組用來描述如何生成一個對象的代碼段。在Python中這...
    TENG書閱讀 1,419評論 0 3
  • Python語言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個如下例子,分析運行結(jié)果: 代碼一: a = 1 def...
    伊森H閱讀 3,177評論 0 15
  • 大多數(shù) Nginx 新手都會頻繁遇到這樣一個困惑,那就是當同一個location配置塊使用了多個 Nginx 模塊...
    SkTj閱讀 8,242評論 0 12

友情鏈接更多精彩內(nèi)容