用Python來編寫腳本簡化日常的運維工作是Python的一個重要用途。在Linux下,有許多系統命令可以讓我們時刻監控系統運行的狀態,如ps,top,free等等。要獲取這些系統信息,Python可以通過subprocess
模塊調用並獲取結果。但這樣做顯得很麻煩,尤其是要寫很多解析代碼。
在Python中獲取系統信息的另一個好辦法是使用psutil這個第三方模塊。顧名思義,psutil = process and system utilities,它不僅可以通過一兩行代碼實現系統監控,還可以跨平台使用,支持Linux/UNIX/OSX/Windows等,是系統管理員和運維小伙伴不可或缺的必備模塊。
安裝psutil
如果安裝了Anaconda,psutil就已經可用了。否則,需要在命令行下通過pip安裝:
pip install psutil
如果遇到Permission denied安裝失敗,請加上sudo重試。
獲取CPU信息
import psutil
psutil.cpu_count() # CPU邏輯數量
psutil.cpu_count(logical=False) # CPU物理核心
# 2說明是雙核超線程, 4則是4核非超線程
統計CPU的用戶/系統/空閑時間:
import psutil
psutil.cpu_times()
再實現類似top命令的CPU使用率,每秒刷新一次,累計10次:
for x in range(10):
psutil.cpu_percent(interval=1, percpu=True)
獲取內存信息
使用psutil獲取物理內存和交換內存信息,分別使用:
psutil.virtual_memory()
psutil.swap_memory()
返回的是字節為單位的整數,可以看到,總內存大小是8589934592 = 8 GB,已用7201386496 = 6.7 GB,使用了66.6%。
獲取磁盤信息
以通過psutil獲取磁盤分區、磁盤使用率和磁盤IO信息:
psutil.disk_partitions() # 磁盤分區信息
psutil.disk_usage('/') # 磁盤使用情況
psutil.disk_io_counters() # 磁盤IO
可以看到,磁盤'/'的總容量是998982549504 = 930 GB,使用了39.1%。文件格式是HFS,opts中包含rw表示可讀寫,journaled表示支持日志。
獲取網絡信息
psutil可以獲取網絡接口和網絡連接信息:
psutil.net_io_counters() # 獲取網絡讀寫字節/包的個數
psutil.net_if_addrs() # 獲取網絡接口信息
psutil.net_if_stats() # 獲取網絡接口狀態
要獲取當前網絡連接信息,使用net_connections():
psutil.net_connections()
你可能會得到一個AccessDenied錯誤,原因是psutil獲取信息也是要走系統接口,而獲取網絡連接信息需要root權限,這種情況下,可以退出Python交互環境,用sudo重新啟動:
#sudo python3
import psutil
psutil.net_connections()
獲取進程信息
通過psutil可以獲取到所有進程的詳細信息:
psutil.pids() # 所有進程ID
p = psutil.Process(3776) # 獲取指定進程ID=3776,其實就是當前Python交互環境
和獲取網絡連接類似,獲取一個root用戶的進程需要root權限,啟動Python交互環境或者.py文件時,需要sudo權限。
psutil還提供了一個test()函數,可以模擬出ps命令的效果:
$ sudo python3
Password: ******
Python 3.6.3 ... on darwin
Type "help", ... for more information.
>>> import psutil
>>> psutil.test()
USER PID %MEM VSZ RSS TTY START TIME COMMAND
root 0 24.0 74270628 2016380 ? Nov18 40:51 kernel_task
root 1 0.1 2494140 9484 ? Nov18 01:39 launchd
root 44 0.4 2519872 36404 ? Nov18 02:02 UserEventAgent
root 45 ? 2474032 1516 ? Nov18 00:14 syslogd
root 47 0.1 2504768 8912 ? Nov18 00:03 kextd
root 48 0.1 2505544 4720 ? Nov18 00:19 fseventsd
_appleeven 52 0.1 2499748 5024 ? Nov18 00:00 appleeventsd
root 53 0.1 2500592 6132 ? Nov18 00:02 configd
...