ps命令 & proc文件系統
ps
查詢所有的進程:
ps -ef | head -1 && ps -ef | grep "進程名" # 顯示所有的進程,顯示的項目有:UID,PID,PPID,C,STIME,TTY,TIME,CMD
或
ps auxf | head -1 && ps auxf grep "進程名" # 顯示所有的進程,顯示的項目有:USER,PID,%CPU,%MEM,VSZ,RSS,TTY,STAT,START,TIME,COMMAND
# 參數:
# f 用ASCII字符顯示樹狀結構,以顯示進程間的相互關係(父子關係)。
舉例:ps auxf grep "進程名" -A 10 # 查看指定進程和該進程的子進程。
# a 顯示所有用戶的所有進程(包括其它用戶)
# 結果:
# USER 啓動進程的用戶
# PID 進程ID
# %CPU 進程佔用CPU的百分比
# %MEM 進程佔用內存的百分比
# VSZ 進程使用的虛擬內存量(KB)
# RSS 進程佔用的內存量(KB)
# TTY 啓動該進程的終端 (注:tty是終端設備的統稱,一般:?表示不關係終端,pts/0表示通過網絡連接的終端,)
# STAT: 該進程的狀態:
R 正在運行或在運行隊列中等待
S 處於休眠狀態
s 包含子進程
l 該進程是一個多線程進程
< 高優先級進程
N 低優先級進程
+ 位於後臺的進程組
D 不可中斷的休眠
T 停止
Z 僵死
W 無駐留頁
L 內存鎖頁
# START 進程的啓動時間
# TIME 進程使用的總cpu時間
# COMMAND 正在執行的命令行的命令
查看指定進程下的線程:
ps -T PID # 進程下的線程數:(ps -T PID | wc -l) - 1
參數:-T Show threads, possibly with SPID column
查看佔用內存最多的進程:
ps aux | awk '{print "used mem "$4 " -pid "$2}' | sort -r | head -5
/proc
概念:Linux內核提供了一種通過proc文件系統,在運行時訪問內核內部數據結構、改變內核設置的機制。proc文件系統是一個僞文件系統,它只存在內存當中,而不佔用外存空間。
使用:ps aux | grep xxx 找到進程的PID,然後 ls -al /proc/PID 查看進程的相關信息。
說明:
/proc/PID/cmdline 進程的完整命令行信息
/proc/PID/cwd 進程當前工作目錄的符號鏈接 eg:/home/jxn/test
/proc/PID/environ 進程的環境變量
/proc/PID/exe 運行程序的符號鏈接 eg:exe -> /home/jxn/soft/java8/bin/java
/proc/PID/status 進程的狀態信息,包括:名稱(Name)、父進程id(ppid)、狀態(State)、線程數(Threads)、內存的使用情況(VmSize、VmRSS) 等。
VmSize 分配給該進程的內存大小。
VmRSS 該進程當前使用的物理內存大小,即該進程的常駐集合內存大小(RSS:Resident Set Size)
VmPeak 進程運行過程中佔用內存的峯值
說明:若進程使用之前已分配但並非正在使用的內存,則VmRSS會變大,而VmSize會保持不變。
/proc/PID/task 進程下的任務(線程)。統計進程的線程數:ls /proc/PID/task | wc -l
/proc/PID/task/線程id/status 線程的狀態信息,包括:名稱(Name)、線程id(Pid)、進程id(Tgid)、狀態(State)
舉例:
# 查看指定進程的內存使用情況。
pid=`ps aux | grep appName | grep -v grep | awk '{print $2}'`
memSize=`cat /proc/${pid}/status | grep "VmRSS" | awk '{print $2}'`
pstree
格式:pstree 參數 PID
參數:
-p 顯示進程id
-a 顯示命令行參數
舉例:
pstree
# 查看所有的進程,以樹狀的形式展現。
pstree -a -p PID
# 查看指定進程的進程樹(包含PID進程和其子孫進程)。