1. 程式人生 > >系統程序管理方法

系統程序管理方法

一、概要

  獲得當前系統的程序資訊,可以讓運維人員得知應用程式的執行狀態,包括程序的啟動時間、檢視或設定CPU親和度、記憶體使用率、IO資訊、socker連線、執行緒數等,這些

資訊可以呈現出指定程序是否存活、資源利用情況,為開發人員的程式碼優化、問題定位提供很好的資料參考。

二、程序資訊

使用pstuil.pids()方法獲取所有的程序PID,使用psutil.Process()方法獲取單個程序的名稱、路徑、狀態、系統資源利用率等資訊,示例如下:

>>> import psutil
>>> psutil.pids()          #列出所有程序PID
[
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 45, 46, 48, 49, 50, 82, 83, 114, 250, 252, 259, 260, 261, 364, 365, 444, 593, 672, 761, 791, 792, 841, 1033, 1076, 1138, 1160, 1226, 1259, 1487, 1610, 1618, 1619, 1624, 1637, 1639
, 1641, 1643, 1645, 1647, 1648, 1650, 1710] >>> p = psutil.Process(1710) #例項化一個Process物件,引數為一程序PID >>> p.name() #程序名 'python' >>> p.exe() #程序bin路徑 '/usr/local/bin/python3.6' >>> p.cwd() #程序工作目錄絕對路徑 '/root' >>> p.status() #程序狀態
'running' >>> p.create_time() #程序建立時間,時間戳格式 1527070301.72 >>> p.uids() #程序uid資訊 puids(real=0, effective=0, saved=0) >>> p.gids() #程序gid資訊 pgids(real=0, effective=0, saved=0) >>> p.cpu_times() #程序CPU時間資訊,包括user、system兩個CPU時間 pcputimes(user=0.05, system=0.0) >>> p.cpu_percent(interval=1.0) 0.0 >>> p.cpu_affinity() #get程序CPU親和度,如果設定程序CPU親和度,將CPU號作為引數即可 [0, 1, 2, 3] >>> p.cpu_affinity([0, 1]) # set >>> p.cpu_num() 1 >>> p.memory_percent() #程序記憶體利用率 0.8030976624121613 >>> p.memory_info() #程序記憶體rss、vms資訊 pmem(rss=8273920, vms=143433728) >>> p.io_counters() #程序IO資訊,包括讀寫IO數及位元組數 pio(read_count=232, write_count=76, read_bytes=110592, write_bytes=0) >>> p.connections() #返回開啟程序socket的namedutples列表,包括fs、family、laddr等資訊 [pconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'), pconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING'), pconn(fd=119, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=60759), raddr=addr(ip='72.14.234.104', port=80), status='ESTABLISHED'), pconn(fd=123, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=51314), raddr=addr(ip='72.14.234.83', port=443), status='SYN_SENT')] >>> p.num_threads() #程序開啟執行緒數 1 >>> p.num_fds() 4 >>> p.threads() [pthread(id=1710, user_time=0.07, system_time=0.01)] >>> p.num_ctx_switches() pctxsw(voluntary=83, involuntary=6) >>> p.nice() 0 >>> psutil.test() USER PID %CPU %MEM VSZ RSS TTY START TIME COMMAND root 1 0.0 0.1 19232 1492 ? 17:53 00:01 init root 2 0.0 ? ? ? ? 17:53 00:00 kthreadd root 3 0.0 ? ? ? ? 17:53 00:00 migration/0 root 4 0.0 ? ? ? ? 17:53 00:00 ksoftirqd/0 root 5 0.0 ? ? ? ? 17:53 00:00 stopper/0 root 6 0.0 ? ? ? ? 17:53 00:00 watchdog/0 .................................

三、popen類的使用

psutil提供的popen類的作用是獲取使用者啟動的應用程式程序資訊,以便跟蹤程式程序的執行狀態,示例:

>>> import psutil
>>> from subprocess import PIPE
#通過psutil的Popen方法啟動的應用程式,可以跟蹤程式執行的所以相關資訊
>>> p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"], stdout=PIPE)
>>> p.name()
'python'
>>> p.username()
'root'
>>> p.communicate()
(b'hello\n', None)
>>> p.wait(timeout=2)
0
>>> p.cpu_times()    #得到程序執行的CPU時間
pcputimes(user=0.01, system=0.0)

四、Windows servies

>>> list(psutil.win_service_iter())
[<WindowsService(name='AeLookupSvc', display_name='Application Experience') at 38850096>,
 <WindowsService(name='ALG', display_name='Application Layer Gateway Service') at 38850128>,
 <WindowsService(name='APNMCP', display_name='Ask Update Service') at 38850160>,
 <WindowsService(name='AppIDSvc', display_name='Application Identity') at 38850192>,
 ...]
>>> s = psutil.win_service_get('alg')
>>> s.as_dict()
{'binpath': 'C:\\Windows\\System32\\alg.exe',
 'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing',
 'display_name': 'Application Layer Gateway Service',
 'name': 'alg',
 'pid': None,
 'start_type': 'manual',
 'status': 'stopped',
 'username': 'NT AUTHORITY\\LocalService'}