2014-04-01 45 views
2

psutil.process_iter()包含什麼?因爲它是一個緩存實例,它是否僅包含當時正在運行的進程,或者它包含了所有內容,並將其當前狀態保留爲用戶驗證狀態?我的代碼:psutil進程沒有運行,或重新使用或已死或殭屍

for _process in psutil.process_iter(): 
    try: 
     new_proc = _process.as_dict(attrs=['cpu_times', 'name', 'pid', 'status']) 
    except psutil.NoSuchProcess: 
     continue 

這裏所有狀態都被過濾了嗎?我還有什麼需要自己覈實的?

+0

感謝您的標記。它需要1500點聲望才能添加標籤。 – user3432110

回答

0
The docs for psutil.process_iter() say

返回一個迭代產生用於運行在本地計算機上 處理所有一個Process類實例。每個實例只創建一次,然後緩存到一個內部表中,每次產生一個元素時更新爲強調的是礦

其中「運行」是由.is_running() method,對於殭屍進程返回True定義。即使進程已經結束,並且其pid被重用,也可以安全地使用該進程。

我的理解是,_process.is_running()psutil.process_iter()產生它的時刻是正確的。原則上,前_process.as_dict回報與信息,幾件事情可能會發生:

  1. 過程可能會死亡 - 變成殭屍:_process.is_running()是真實的,pidstatus有意義
  2. 可以收穫 - 死區死了的進程信息不可用(psutil.NoSuchProcess除外)或過時的(如果緩存)
  3. 其PID可重複使用 - 一些_process方法可能會返回錯誤的過程中的信息。 .is_running()使用多個進程屬性,因此它應該檢測到pid被重用時的情況。

通常,OS不會立即重用pid因此p.3不應該頻繁發生。

+0

這是正確的。 'Process'類通過PID綁定到一個進程。因此,該PID可以在任何時候消失或被重用[1]。這就是爲什麼每次處理它時都應該嘗試/除了捕獲至少'NoSuchProcess'異常(其中還包括'ZombieProcess')。 [1]必須說,除非'進程'實例是舊的,否則引起PID重用的風險非常低或可能爲0。 –