linux 基礎(10)程序管理

2023-02-19 06:00:34

使用 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