最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

分析運(yùn)行中的 Python 進(jìn)程詳細(xì)解析

 更新時(shí)間:2019年06月22日 09:19:46   作者:四火的嘮叨  
這篇文章主要介紹了分析運(yùn)行中的 Python 進(jìn)程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

在 Java 中打印當(dāng)前線程的方法棧,可以用 kill -3 命令向 JVM 發(fā)送一個(gè) OS 信號(hào),JVM 捕捉以后會(huì)自動(dòng) dump 出來(lái);當(dāng)然,也可以直接使用 jstack 工具完成,這些方法好幾年前我在這篇性能分析的文章 中介紹過(guò)。這樣的需求可以說(shuō)很常見(jiàn),比如定位死鎖,定位一個(gè)不工作的線程到底卡在哪里,或者定位為什么 CPU 居高不下等等問(wèn)題。

現(xiàn)在工作中我用的是 Python,需要線上問(wèn)題定位的緣故,也有了類似的需求——想要知道當(dāng)前的 Python 進(jìn)程“在干什么”。但是沒(méi)有了 JVM 的加持,原有的命令或者工具都不再適用。傳統(tǒng)的 gdb 的 debug 大法在線上也不好操作。于是我尋找了一些別的方法,來(lái)幫助定位問(wèn)題,我把它們記錄在這里。

signal

在代碼中,我們可以使用 signal 為進(jìn)程預(yù)先注冊(cè)一個(gè)信號(hào)接收器,在進(jìn)程接收到特定信號(hào)的時(shí)候,可以打印方法棧:

import traceback, signal
class Debugger():
  def __init__(self, logger):
    self._logger = logger
  def log_stack_trace(self, sig, frame):
    d={'_frame':frame}
    d.update(frame.f_globals)
    d.update(frame.f_locals)
    messages = "Signal received. Stack trace:\n"
    messages += ''.join(traceback.format_stack(frame))
    self._logger.warn(messages)
  def listen(self):
    signal.signal(signal.SIGUSR1, self.log_stack_trace)

通過(guò)調(diào)用上面的 listen 方法(比如 new Debug(logger).listen()),就將一個(gè)可以接收 SIGUSR1 并打印方法棧的接收器注冊(cè)到當(dāng)前進(jìn)程了。這里是打印方法棧,但是實(shí)際上可以做任何事,因?yàn)榉椒▓?zhí)行的當(dāng)前,上下文已經(jīng)跑到進(jìn)程里面了。

那么怎么向進(jìn)程發(fā)送信號(hào)呢?和 JVM 的方法類似,可以通過(guò)操作系統(tǒng)命令來(lái)發(fā)送:

kill -30 pid

這里的信號(hào)為什么是 30?這是因?yàn)?SIGUSR1 被當(dāng)前操作系統(tǒng)定義成 30(請(qǐng)注意不同的操作系統(tǒng)這個(gè)映射表是可能不同的),這點(diǎn)可以通過(guò) man signal 查看:

No Name Default Action Description
 SIGHUP terminate process terminal line hangup
 SIGINT terminate process interrupt program
 SIGQUIT create core image quit program
 SIGILL create core image illegal instruction
 SIGTRAP create core image trace trap
 SIGABRT create core image abort program (formerly SIGIOT)
 SIGEMT create core image emulate instruction executed
 SIGFPE create core image floating-point exception
 SIGKILL terminate process kill program
 SIGBUS create core image bus error
 SIGSEGV create core image segmentation violation
 SIGSYS create core image non-existent system call invoked
 SIGPIPE terminate process write on a pipe with no reader
 SIGALRM terminate process real-time timer expired
 SIGTERM terminate process software termination signal
 SIGURG discard signal urgent condition present on socket
 SIGSTOP stop process stop (cannot be caught or ignored)
 SIGTSTP stop process stop signal generated from keyboard
 SIGCONT discard signal continue after stop
 SIGCHLD discard signal child status has changed
 SIGTTIN stop process background read attempted from control terminal
 SIGTTOU stop process background write attempted to control terminal
 SIGIO discard signal I/O is possible on a descriptor (see fcntl(2))
 SIGXCPU terminate process cpu time limit exceeded (see setrlimit(2))
 SIGXFSZ terminate process file size limit exceeded (see setrlimit(2))
 SIGVTALRM terminate process virtual time alarm (see setitimer(2))
 SIGPROF terminate process profiling timer alarm (see setitimer(2))
 SIGWINCH discard signal Window size change
 SIGINFO discard signal status request from keyboard
 SIGUSR1 terminate process User defined signal 1
 SIGUSR2 terminate process User defined signal 2

當(dāng)然,也可以寫(xiě)一點(diǎn)點(diǎn) python 腳本來(lái)發(fā)送這個(gè)信號(hào):

import os, signal
os.kill($PID, signal.SIGUSR1)

原理是一樣的。

strace

如果進(jìn)程已經(jīng)無(wú)響應(yīng)了,或者上面的信號(hào)接收器沒(méi)有注冊(cè),那么就要考慮別的方法來(lái)或者“進(jìn)程在干什么”這件事情了。其中,一個(gè)有用的命令是 strace:

strace -p pid

比如,我自己寫(xiě)了一個(gè)測(cè)試腳本 t.py,使用 python 執(zhí)行,然后調(diào)用 sleep,再給它發(fā)送一個(gè) SIGUSR1 的消息,它打印方法棧并退出。這整個(gè)過(guò)程,我使用 strace 可以得到這樣的結(jié)果:

strace -p 9157
strace: Process 9157 attached
select(0, NULL, NULL, NULL, {9999943, 62231}) = ? ERESTARTNOHAND (To be restarted if no handler)
--- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=9273, si_uid=9007} ---
rt_sigreturn({mask=[]})         = -1 EINTR (Interrupted system call)
stat("t.py", {st_mode=S_IFREG|0644, st_size=1281, ...}) = 0
open("t.py", O_RDONLY)         = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=1281, ...}) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=1281, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f631e866000
read(3, "import traceback, signal, time\n "..., 8192) = 1281
read(3, "", 4096)            = 0
close(3)                = 0
munmap(0x7f631e866000, 4096)      = 0
stat("t.py", {st_mode=S_IFREG|0644, st_size=1281, ...}) = 0
write(1, "Signal received. Stack trace:\n "..., 134) = 134
write(1, "\n", 1)            = 1
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f631e06f5d0}, {0x7f631e392680, [], SA_RESTORER, 0x7f631e06f5d0}, 8) = 0
rt_sigaction(SIGUSR1, {SIG_DFL, [], SA_RESTORER, 0x7f631e06f5d0}, {0x7f631e392680, [], SA_RESTORER, 0x7f631e06f5d0}, 8) = 0
exit_group(0)              = ?
+++ exited with 0 +++

可以看到從 strace attached 開(kāi)始,到進(jìn)程退出,所有重要的調(diào)用都被打印出來(lái)了。

在 iOS 下,沒(méi)有 strace,但是可以使用類似的(更好的)命令 dtruss。

lsof

lsof 可以打印某進(jìn)程打開(kāi)的文件,而 Linux 下面一切都是文件,因此查看打開(kāi)的文件列表有時(shí)可以獲取很多額外的信息。比如,打開(kāi)前面提到的這個(gè)測(cè)試進(jìn)程:

lsof -p 16872
COMMAND  PID USER  FD  TYPE DEVICE  SIZE/OFF   NODE NAME
Python 16872 xxx cwd  DIR  1,5    2688 1113586 /Users/xxx
Python 16872 xxx txt  REG  1,5   51744 10627527 /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
Python 16872 xxx txt  REG  1,5   52768 10631046 /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_locale.so
Python 16872 xxx txt  REG  1,5   65952 10631134 /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/time.so
Python 16872 xxx txt  REG  1,5   841440 10690598 /usr/lib/dyld
Python 16872 xxx txt  REG  1,5 1170079744 10705794 /private/var/db/dyld/dyld_shared_cache_x86_64h
Python 16872 xxx  0u  CHR  16,2  0t39990   649 /dev/ttys002
Python 16872 xxx  1u  CHR  16,2  0t39990   649 /dev/ttys002
Python 16872 xxx  2u  CHR  16,2  0t39990   649 /dev/ttys002

它有幾個(gè)參數(shù)很常用,比如-i,用來(lái)指定網(wǎng)絡(luò)文件(如果是“-i: 端口號(hào)”這樣的形式還可以指定端口)。

總結(jié)

以上所述是小編給大家介紹的分析運(yùn)行中的 Python 進(jìn)程,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!

相關(guān)文章

  • python zip,lambda,map函數(shù)代碼實(shí)例

    python zip,lambda,map函數(shù)代碼實(shí)例

    這篇文章主要介紹了python zip,lambda,map函數(shù)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Python 刪除整個(gè)文本中的空格,并實(shí)現(xiàn)按行顯示

    Python 刪除整個(gè)文本中的空格,并實(shí)現(xiàn)按行顯示

    今天小編就為大家分享一篇Python 刪除整個(gè)文本中的空格,并實(shí)現(xiàn)按行顯示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • pandas DataFrame 警告(SettingWithCopyWarning)的解決

    pandas DataFrame 警告(SettingWithCopyWarning)的解決

    這篇文章主要介紹了pandas DataFrame 警告(SettingWithCopyWarning)的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python多進(jìn)程與服務(wù)器并發(fā)原理及用法實(shí)例分析

    Python多進(jìn)程與服務(wù)器并發(fā)原理及用法實(shí)例分析

    這篇文章主要介紹了Python多進(jìn)程與服務(wù)器并發(fā)原理及用法,深入淺出的介紹了進(jìn)程、并行、并發(fā)、同步、異步等相關(guān)概念與原理,并結(jié)合實(shí)例形式給出了Python多進(jìn)程編程相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • python merge、concat合并數(shù)據(jù)集的實(shí)例講解

    python merge、concat合并數(shù)據(jù)集的實(shí)例講解

    下面小編就為大家分享一篇python merge、concat合并數(shù)據(jù)集的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • 一文詳解Python如何處理函數(shù)調(diào)用超時(shí)問(wèn)題

    一文詳解Python如何處理函數(shù)調(diào)用超時(shí)問(wèn)題

    在Python開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到需要控制函數(shù)執(zhí)行時(shí)間的場(chǎng)景,本文將深入探討Python中處理函數(shù)調(diào)用超時(shí)的幾種方法,感興趣的小伙伴可以參考一下
    2025-04-04
  • 如何用Python 加密文件

    如何用Python 加密文件

    這篇文章主要介紹了如何用Python 加密文件,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • Python自動(dòng)化辦公實(shí)戰(zhàn)案例詳解(Word、Excel、Pdf、Email郵件)

    Python自動(dòng)化辦公實(shí)戰(zhàn)案例詳解(Word、Excel、Pdf、Email郵件)

    這篇文章基于Python自動(dòng)化辦公,主要介紹了使用Python相關(guān)庫(kù),依次完成Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動(dòng)郵件發(fā)送任務(wù)。感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • 用python爬取豆瓣前一百電影

    用python爬取豆瓣前一百電影

    大家好,本篇文章主要講的是用python爬取豆瓣前一百電影,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Python實(shí)現(xiàn)原神抽卡的方法

    Python實(shí)現(xiàn)原神抽卡的方法

    這篇文章主要為大家介紹了Python實(shí)現(xiàn)原神抽卡的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12

最新評(píng)論

枣阳市| 峨眉山市| 开平市| 开封县| 虎林市| 上犹县| 林州市| 钦州市| 襄樊市| 黔西县| 富平县| 元谋县| 阳新县| 潮州市| 昌平区| 长垣县| 石林| 共和县| 黔西县| 江北区| 通渭县| 米泉市| 墨竹工卡县| 香港 | 上虞市| 梁山县| 内乡县| 麻城市| 广宗县| 伊吾县| 赣州市| 麦盖提县| 云霄县| 房山区| 当阳市| 格尔木市| 蒙阴县| 扶绥县| 通江县| 察隅县| 青铜峡市|