當電腦上插有多臺手機,我們對手機進行自動化測試,必然會執行adb shell命令,有時代碼不能很好的對adb進程進行回收,導致電腦上會殘留大量的adb進程,每個adb進程都會佔用電腦少量內存,adb數量多的時候,佔用的內存也是驚人的,會導致電腦響應速度變慢等問題。因此,我們需要定期將電腦上的adb進程給殺死掉。
現在我們面臨一個問題,如何殺死一臺手機的adb命令而不影響另外一臺手機的adb shell命令的正常執行呢?一臺機器我們可以執行如下代碼:
os.system('taskkill /IM adb.exe /F')
這行代碼會殺死所有的adb進程。如果是多臺手機設備,會對其他的機器產生影響。我們在任務管理器裏面對進程選擇管理行,那樣我們就能看到adb進程詳細的信息,如下圖所示:
那麼,我們有沒有辦法獲取這些adb進程詳細信息呢?答案是肯定的。可以通過psutil這個模塊來搞定。在Python代碼中,我們使用import psutil即可。但是導入這個模塊時,我們必須安裝該模塊,我使用的是psutil-3.4.2.win32-py3.3.exe,這個應用程序名字比較特別,但又充分顯示其信息。psutil-3.4.2表明psutil的版本爲3.4.2,在Windows 32位環境下使用,相應的Python應用程序版本爲3.3,不然使用的時候會出錯,這個就不再詳細說明。
話不多說,我們直接貼代碼:
def killDevicePid(device):
filterstr1='adb'
filterstr2=device
for proc in psutil.process_iter():
try:
pinfo = proc.as_dict(attrs=['pid', 'name'])
pid = pinfo['pid']
if ((filterstr1 in proc.cmdline()) and (filterstr2 in proc.cmdline())):
# print(filterstr)
killcmd = 'taskkill /PID ' + str(pid) + ' /F'
try:
os.system(killcmd)
print(killcmd)
except OSError as e:
print('no process.')
except psutil.NoSuchProcess:
pass
except ProcessLookupError:
pass
except psutil.AccessDenied:
pass
finally:
del pinfo
del proc
其中,device爲機器的設備號,我們根據設備號來殺死相應機器的所有adb進程。psutil.process_iter()這個是獲取到電腦上所有進程信息,然後對其進程遍歷,得到各個進程的pid和name。proc.cmdline()爲進程的命令行信息,如上圖所示,我們可以判斷該命令行信息是否含有機器設備號和adb進程,如果都含有的話,我們可以通過taskkill命令和adb進程的pid來殺死adb進程。這樣,我們就能對某一臺設備的adb進程進行kill,而不影響其他設備的adb
shell進程的正常執行。
目前爲止,我講完了,今後大家如果想獲取與設備進程相關的信息,或者想對進程進程控制,都可以使用該文的相關方法。