使用 ps 觀察程式
ps -l
ps
程式可以查詢當前在執行的程式資訊。ps -l
可以列出詳細的資訊,預設僅列出當前 bash 相關的程式。
sudo -i
ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 2133 2113 0 80 0 - 3026 do_sys pts/0 00:00:00 sudo
4 S 0 2134 2133 0 80 0 - 2651 do_wai pts/0 00:00:00 bash
4 R 0 2146 2134 0 80 0 - 2854 - pts/0 00:00:00 ps
F
代表程式旗標,表明程式的一些性質,圖中 4 代表是 root 執行。
S
代表該程式的執行狀態。
字母 | 狀態 |
---|---|
R | Running 執行中 |
S | Sleep 休眠中,隨意可以喚醒 |
D | Disk Sleep 深入休眠,通常正在進行磁碟IO,不可喚醒 |
T | Stopped 暫停狀態 |
Z | Zombie 程式已結束,但父程式沒有回收 |
UID 是程式執行者的 UID, PID 就是程式的 ID,PPID 就是父程式的 PID。
PRI 和 NI 代表程式的執行優先順序,越小則越優先執行。
C 代表程式的CPU佔用率。ADDR 和 SZ 和記憶體相關,代表記憶體中的位置和佔記憶體大小。WCHAN 表示 waiting channel 表明程式的等待執行進度。TIME代表該程式佔用CPU執行的時間。
TTY 表示所在的終端,本地終端是TTY,其他則是動態的虛擬終端 pts。CMD 代表是哪個程式指令。
ps aux
ps aux
或者ps -aux
可以檢視當前所有程式(兩種不同的引數風格)。
ps aux | head -n 4
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 102724 11524 ? Ss 01:51 0:01 /sbin/init auto noprompt
root 2 0.0 0.0 0 0 ? S 01:51 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 01:51 0:00 [rcu_gp]
這和ps -l
的資訊基本是一樣,RSS表示使用的實體記憶體大小,VSZ表示使用的虛擬記憶體大小,TTY為 ? 表示該程式並不在任何終端下執行。Start 表明該程式開始執行的時間。
top
top 可以動態檢視幾秒鐘內各程式的資訊,不過他可以按照記憶體使用,CPU佔用等排序,可以更直觀的檢視資源使用資訊。
pstree
pstree
可以把當前程式的父子呼叫關係繪製成一個樹形圖,便於檢視他們的關係。
向程式傳送訊號
在 linux 中,與程式互動的重要手段之一就是向程式傳送訊號。kill
可以用於傳送訊號,kill -l
可以查詢訊號的種類
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
使用 kill -signalnumber PID
可以向對應 PID 的程式傳送訊號。
kill -9 1000 # -9即 kill 訊號,強制要求程式退出,這是最常用的
kill -15 %2 # %開頭表示背景工作號,-15表示要求正常結束
程式的優先順序
每個程式都有一個PRI數值(priority)和 NI 數值(nice),這兩個數字加起來就是程式的優先順序,越低越優先。
為什麼要設定兩個數值呢?因為 PRI 是核心算出來的,不可更改的數,NI 則是使用者可以手動調整的。透過調整 NI,就可以一定程度上自訂程式的優先順序。
# nice 命令
nice -n 10 command # 賦值 ni=10 的命令
renice 10 PID # 修改已有程式的 ni 值
root 可以修改所有程式的 NI 值,範圍(-20 ~ 19),而一般使用者只能調整自己程式的值,範圍(0~19)。
查詢程式開啟的檔案
fuser 查詢一個檔案或目錄的使用者。
~$ fuser -v . # -v 檢視詳細資訊
USER PID ACCESS COMMAND
/home/ubuntu: ubuntu 225862 ..c.. bash
相對的,lsof 查詢程式已經開啟的檔案
lsof [-adu] # 列出程式開啟的檔案
+d: 限定目錄
-u: 限定檔案
-a: 需要多個條件同時滿足
lsof -u ubuntu
# 太多了!而且不能指定pid,所以只能用grep選中要檢視的程式了
lsof -a -u ubuntu +d .
pidof 可以快速根據命令名查詢pid,預設會找出所有的pid
pidof bash
225862