列出進程
目標
完成本節(jié)內(nèi)容后距辆,你能夠獲得系統(tǒng)上運行的程序的相關信息绷雏,以確定狀態(tài)、資源使用和所有權,這樣你就可以控制它們坏瘩。
進制的定義
進程是一個已啟動的可執(zhí)行程序的運行實例棍矛。一個進程包括:
- 一個分配的內(nèi)存地址空間
- 安全屬性恭应,包括所有權憑證和特權
- 一個或多個程序代碼的執(zhí)行線程
進程狀態(tài)
一個進程的環(huán)境包括:
- 本地變量和全局變量
- 當前調(diào)度上下文
- 已分配的系統(tǒng)資源沧烈,如文件描述符和網(wǎng)絡端口等
一個現(xiàn)有的(父進程)進程復制自己的地址空間(fork)以創(chuàng)建一個新的(子進程)結構。每個新進程都被分配了一個唯一的進程ID(PID)喂击,用于跟蹤和安全剂癌。PID和父進程的進程ID(PPID)是新進程環(huán)境的元素。任何進程都可以創(chuàng)建一個子進程翰绊。所有的進程都是第一個系統(tǒng)進程的子進程珍手,即Red Hat Enterprise Linux 8系統(tǒng)上的systemd的子進程。
通過fork例程,子進程繼承了安全身份琳要、先前和當前的文件描述符寡具、端口和資源權限、環(huán)境變量以及程序代碼稚补。然后童叠,子進程可以執(zhí)行自己的程序代碼。通常情況下课幕,父進程在子進程運行時厦坛,父進程會休眠,當子進程完成時乍惊,設置一個請求(等待)信號杜秸。退出時,子進程已經(jīng)關閉或丟棄了它的資源和環(huán)境润绎。唯一剩下的資源撬碟,稱為僵尸,是進程表中的一個條目莉撇。當子進程退出時呢蛤,父進程在子進程退出時發(fā)出喚醒的信號,清理進程表中的子進程條目棍郎,從而釋放出子進程的最后一個資源其障。然后,父進程繼續(xù)執(zhí)行自己的程序代碼涂佃。
描述進程狀態(tài)
在多任務操作系統(tǒng)中励翼,每個CPU(或CPU核心)可以在一個時間點上處理一個進程。當一個進程運行時辜荠,它對CPU時間和資源分配的直接需求會發(fā)生變化汽抚。進程被分配了一個狀態(tài),這個狀態(tài)會隨著情況的變化而變化侨拦。
Linux進程狀態(tài)如上圖所示,如下表所示:
名稱 | 標志 | 內(nèi)核定義的狀態(tài)名稱和描述 |
---|---|---|
Running | R | TASK_RUNNING:進程正在CPU上執(zhí)行或等待運行辐宾。進程可以是執(zhí)行用戶例程或內(nèi)核例程(系統(tǒng)調(diào)用)狱从,也可以在運行(或可運行)狀態(tài)時處于隊列和準備狀態(tài)。 |
Sleeping | S | TASK_INTERRUPTIBLE:進程正在等待某些條件:硬件請求叠纹、系統(tǒng)資源訪問或信號季研。當事件或信號滿足條件時,進程返回到運行狀態(tài)誉察。 |
D | TASK_UNINTERRUPTIBLE:該進程也是Sleeping与涡,但與S狀態(tài)不同,不響應信號。僅在進程中斷可能導致設備狀態(tài)不可預測時使用驼卖。 | |
K | TASK_KILLABLE:與不間斷的D狀態(tài)相同氨肌,但修改后允許一個等待的任務響應應該被殺死的信號(完全退出)。實用程序經(jīng)常將可殺進程顯示為D狀態(tài)酌畜。 | |
I | TASK_REPORT_IDLE:狀態(tài)D的一個子集怎囚,內(nèi)核在計算負載平均時不計算這些進程。用于內(nèi)核線程桥胞。標志TASK_UNINTERRUPTABLE和TASK_NOLOAD被設置恳守。類似于TASK_KILLABLE,也是狀態(tài)D的一個子集贩虾,它接受致命信號催烘。 | |
Stopped | T | TASK_STOPPED:進程已被停止(暫停),通常由用戶或其他進程發(fā)出信號缎罢。該進程可以繼續(xù)進行(恢復)由另一個信號返回運行伊群。 |
T | TASK_TRACED:正在調(diào)試的進程也被暫時停止,并共享同一個T狀態(tài)標志屁使。 | |
Zombie | Z | EXIT_ZOMBIE:一個子進程在退出時向其父進程發(fā)出信號在岂。除了進程標識(PID)外,所有的資源都被釋放蛮寂。 |
X | EXIT_DEAD:當父進程清理(收割)剩余的子進程結構時蔽午,該進程現(xiàn)在被完全釋放。這種狀態(tài)永遠不會在進程列表工具中被觀察到酬蹋。 |
為什么進程狀態(tài)很重要及老?
在排除系統(tǒng)故障時,了解內(nèi)核如何與進程通信以及進程之間的通信方式是非常重要的范抓。在進程創(chuàng)建時骄恶,系統(tǒng)會給進程分配一個狀態(tài)。top命令的S列或ps的STAT列顯示了每個進程的狀態(tài)匕垫。在一個CPU系統(tǒng)中僧鲁,一次只能運行一個進程。有可能看到多個進程的狀態(tài)為R象泵,但不是所有的進程都會連續(xù)運行寞秃,有的進程會處于狀態(tài)等待狀態(tài)。
[user@host ~]$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 244344 13684 9024 S 0.0 0.7 0:02.46 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
...output omitted...
[user@host ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...output omitted...
root 2 0.0 0.0 0 0 ? S 11:57 0:00 [kthreadd] student 3448 0.0 0.2 266904 3836 pts/0 R+ 18:07 0:00 ps aux
...output omitted..
進程可以使用信號暫停偶惠、停止春寿、恢復、終止和中斷忽孽。信號在本章后面會詳細討論绑改。信號可以被其他進程谢床、內(nèi)核本身或登錄到系統(tǒng)的用戶使用。
查看進程
ps命令用于列出當前進程厘线。它可以提供詳細的進程信息识腿,包括:
- 用戶標識(UID),決定了進程的權限
- 不同的進程識別碼(PID)
- 已消耗的CPU和實際時間
- 進程分配了多少內(nèi)存
- stdout流的位置皆的,被稱為控制終端
- 當前的進程狀態(tài)
Linux版本的ps支持三種選項格式:
UNIX (POSIX)選項覆履,可以分組,并且必須在前面加上破折號费薄。
BSD選項硝全,可以進行分組,不使用破折號楞抡。
GNU 長選項伟众,前面帶有兩個破折號。例如召廷,ps -aux與ps aux不同凳厢。
也許最常用的一組選項aux顯示所有過程,包括沒有控制終端的進程竞慢。 較長的清單(選項lax)提供了更多的技術細節(jié)先紫,但可以通過避免用戶名查找來更快地顯示。 相似的UNIX語法使用-ef選項顯示所有進程筹煮。
[user@host ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 51648 7504 ? Ss 17:45 0:03 /usr/lib/systemd/ syst root 2 0.0 0.0 0 0 ? S 17:45 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 17:45 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 17:45 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 17:45 0:00 [migration/0]
...output omitted...
[user@host ~]$ ps lax
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 1 0 20 0 51648 7504 ep_pol Ss ? 0:03 /usr/lib/ systemd/
1 0 2 0 20 0 0 0 kthrea S ? 0:00 [kthreadd]
1 0 3 2 20 0 0 0 smpboo S ? 0:00 [ksoftirqd/0]
1 0 5 2 0 -20 0 0 worker S< ? 0:00 [kworker/0:0H]
1 0 7 2 -100 - 0 0 smpboo S ? 0:00 [migration/0]
...output omitted...
[user@host ~]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 17:45 ? 00:00:03 /usr/lib/systemd/systemd -switched-ro root 2 0 0 17:45 ? 00:00:00 [kthreadd]
root 3 2 0 17:45 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 17:45 ? 00:00:00 [kworker/0:0H]
root 7 2 0 17:45 ? 00:00:00 [migration/0]
...output omitted...
默認情況下遮精,沒有選項的ps會選擇所有與當前用戶具有相同有效用戶ID(EUID)的進程,并且與ps被調(diào)用的同一終端相關聯(lián)败潦。
括號內(nèi)的進程(通常在列表的頂部)是計劃的內(nèi)核線程本冲。
僵尸被列為退出或消亡。
ps的輸出顯示一次劫扒。使用top進行動態(tài)更新的過程顯示檬洞。
ps可以以樹形格式顯示,因此可以查看父進程和子進程之間的關系沟饥。
默認的輸出是按進程ID號排序添怔。乍一看,這似乎是按時間順序排列的贤旷。但是广料,內(nèi)核會重用進程ID,所以順序沒有看起來那么有條理遮晚。要進行排序性昭,請使用 -O 或 --sort 選項拦止。顯示順序與系統(tǒng)進程表的順序相匹配县遣,當進程死亡和新的進程被創(chuàng)建時糜颠,系統(tǒng)進程表會重用表行。輸出可能會按時間順序顯示萧求,但除非使用明確的 -O 或 --sort選項其兴,否則不能保證輸出是按時間順序顯示的。
控制作業(yè)
目標
完成本節(jié)后夸政,您應該能夠使用Bash作業(yè)控制來管理從同一終端會話啟動的多個進程元旬。
描述作業(yè)和會話
作業(yè)控制是shell的一個功能,它允許一個shell實例運行和管理多個命令守问。
一個作業(yè)與在shell提示符輸入的每個管道相關聯(lián)匀归。該管道中的所有進程都是作業(yè)的一部分,是同一個進程組的成員耗帕。如果在shell提示符中只輸入了一條命令穆端,則可視為一條命令的最小 "流水線",創(chuàng)建一個只有一個成員的作業(yè)仿便。
該控制終端的后臺進程是與該終端相關聯(lián)的任何其他工作的成員体啰。終端的后臺進程不能讀取終端的輸入或接收鍵盤產(chǎn)生的中斷,但可以對終端進行寫操作嗽仪。后臺的作業(yè)可能被停止(暫停)荒勇,也可能正在運行。如果正在運行的后臺作業(yè)試圖從終端讀取闻坚,則會自動暫停沽翔。
每個終端都是自己的會話,可以有一個前臺進程和任意數(shù)量的獨立后臺進程鲤氢。一個作業(yè)正好是一個會話的一部分:屬于其控制終端的那個會話搀擂。
ps命令在TTY列中顯示了進程的控制終端的設備名稱。有些進程卷玉,如系統(tǒng)守護進程哨颂,是由系統(tǒng)啟動的,而不是從shell提示符中啟動的相种。這些進程沒有控制終端威恼,不是作業(yè)的成員,不能被帶到前臺寝并。對于這些進程箫措,ps命令會在TTY欄中顯示一個問號(?)。
后臺運行的作業(yè)
任何命令或管道都可以在后臺啟動衬潦,只需在命令行末尾加上一個安培拉(&)即可斤蔓。Bash shell會顯示一個作業(yè)編號(會話中唯一的)和新的子進程的PID。shell不會等待子進程終止镀岛,而是顯示shell提示符弦牡。
[user@host ~]$ sleep 10000 &
[1] 5947
[user@host ~]$
當包含管道的命令行使用安培號(&)發(fā)送到后臺時友驮,管道中最后一條命令的PID被用作輸出。管道中的所有進程仍然是該作業(yè)的成員驾锰。
[user@host ~]$ example_command | sort | mail -s "Sort output" &
[1] 5998
您可以使用 jobs 命令顯示 Bash 正在跟蹤某個會話的作業(yè)列表卸留。
[user@host ~]$ jobs
[1]+ Running sleep 10000 &
[user@host ~]$
通過使用帶有作業(yè)ID(%作業(yè)編號)的fg命令,可以將背景作業(yè)帶到前臺椭豫。
[user@host ~]$ fg %1
sleep 10000
在前面的例子中耻瑟,sleep命令現(xiàn)在在控制終端上的前臺運行。shell本身再次進入睡眠狀態(tài)赏酥,等待這個子進程退出喳整。
要將前臺進程發(fā)送至后臺,首先在終端中按鍵盤生成的懸浮請求(Ctrl+Z)裸扶。
sleep 10000
^Z
[1]+ Stopped sleep 10000
[user@host ~]$
工作立即被放到后臺算柳,并被暫停。
ps j 命令顯示與作業(yè)相關的信息姓言。PID 是該進程的唯一進程 ID瞬项。THe PPID 是該進程的父進程的 PID,即啟動(分叉)該進程的進程何荚。PGID是進程組長的PID囱淋,通常是作業(yè)管道中第一個進程的PID。SID 是會話組長的 PID餐塘,通常是控制終端上運行的交互式 shell妥衣。由于示例中的sleep命令當前處于暫停狀態(tài),所以它的進程狀態(tài)為T戒傻。
[user@host ~]$ ps j
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
2764 2768 2768 2768 pts/0 6377 Ss 1000 0:00 /bin/bash
2768 5947 5947 2768 pts/0 6377 T 1000 0:00 sleep 10000
2768 6377 6377 2768 pts/0 6377 R+ 1000 0:00 ps j
要啟動在后臺運行的懸浮進程税手,請使用具有相同作業(yè)ID的bg命令。
[user@host ~]$ bg %1
[1]+ sleep 10000 &
shell將警告試圖退出帶有暫停作業(yè)的終端窗口(會話)的用戶需纳。如果用戶試圖立即再次退出芦倒,則暫停的作業(yè)將被殺死。
結束進程
目標
完成本節(jié)內(nèi)容后不翩,你能夠:
- 使用命令來殺死并進程或者與進程通信兵扬。
- 確定守護進程的特點。
- 終端用戶會話和流程口蝠。
信號的過程控制
信號是向進程傳遞的軟件中斷器钟。信號向正在執(zhí)行的程序報告事件。產(chǎn)生信號的事件可以是錯誤妙蔗、外部事件(如I/O請求或過期的定時器)傲霸,也可以是顯式請求(使用信號發(fā)送命令或鍵盤序列)。
下表列出了系統(tǒng)管理員在日常流程管理中使用的基本信號。請用其簡短的(HUP)或正確的(SIGHUP)名稱來表示信號昙啄。
基本過程管理信號
型號編號 | 簡稱 | 定義 | 目的 |
---|---|---|---|
1 | HUP | 掛起 | 用于報告終端的控制進程的終止乃摹。也用于請求進程重新初始化(配置重新加載)而不終止。 |
2 | INT | 鍵盤中斷 | 導致程序終止跟衅。可以被阻止或處理播歼。通過按INTR組合鍵(Ctrl+C)發(fā)送伶跷。 |
3 | QUIT | 鍵盤退出 | 類似于SIGINT,但也會在終止時產(chǎn)生一個過程轉儲秘狞。通過按QUIT組合鍵(Ctrl+)發(fā)送叭莫。 |
9 | KILL | 結束進程,一旦進行無法阻止 | 導致程序突然終止烁试。不能被阻止雇初、忽略或處理;總是致命的减响。 |
15 默認 |
TERM | 終止 | 導致程序終止靖诗。與SIGKILL不同,可以被阻止支示、忽略或處理刊橘。要求程序終止的 "polite "方式;允許自我清理颂鸿。 |
18 | CONT | 繼續(xù) | 發(fā)送到一個進程中恢復促绵,如果停止。不能被阻止嘴纺。即使處理了败晴,也總是恢復進程。 |
19 | STOP | 停止栽渴,無法阻止 | 暫停處理尖坤。不能被阻止或處理。 |
20 | TSTP | 鍵盤停止 | 與SIGSTOP不同闲擦,可以屏蔽糖驴、忽略或處理。通過按SUSP鍵組合(Ctrl+Z)發(fā)送佛致。 |
每個信號都有一個默認的動作贮缕,通常是以下之一:
- Term - 導致程序一次性終止(退出)。
- Core - 導致程序保存一個內(nèi)存映像(核心轉儲)俺榆,然后終止感昼。
- Stop 使程序停止執(zhí)行(暫停)并等待繼續(xù)(恢復)。
程序可以通過實現(xiàn)處理程序例程來忽略罐脊、替換或擴展信號的默認動作定嗓,從而對預期的事件信號做出反應蜕琴。
通過明確請求發(fā)送信號的命令
你可以通過按鍵盤控制序列給它們的當前前臺進程發(fā)出信號,以暫停(Ctrl+Z)宵溅、殺死(Ctrl+C)或核心轉儲(Ctrl+\)進程凌简。但是,您將使用信號發(fā)送命令向后臺進程或不同會話中的進程發(fā)送信號恃逻。
信號可以通過名稱(例如-HUP或-SIGHUP)或數(shù)字(相關的-1)指定為選項雏搂。用戶可以殺死自己的進程,但要殺死其他人擁有的進程需要root權限寇损。
kill命令通過PID號向進程發(fā)送一個信號凸郑。盡管有這個名字,但 kill 命令可以用于發(fā)送任何信號矛市,而不僅僅是用于終止程序的信號芙沥。你可以使用 kill -l 命令來列出所有可用信號的名稱和編號。
[user@host ~]$ 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 ...output omitted...
[user@host ~]$ ps aux | grep job
5194 0.0 0.1 222448 2980 pts/1 S 16:39 0:00 /bin/bash /home/user/bin/ control job1 5199 0.0 0.1
222448 3132 pts/1 S 16:39 0:00 /bin/bash /home/user/bin/ control job2
5205 0.0 0.1 222448 3124 pts/1 S 16:39 0:00 /bin/bash /home/user/bin/ control job3
5430 0.0 0.0 221860 1096 pts/1 S+ 16:41 0:00 grep --color=auto job
[user@host ~]$ kill 5194
[user@host ~]$ ps aux | grep job
user 5199 0.0 0.1 222448 3132 pts/1 S 16:39 0:00 /bin/bash /home/ user/bin/control job2
user 5205 0.0 0.1 222448 3124 pts/1 S 16:39 0:00 /bin/bash /home/ user/bin/control job3
user 5783 0.0 0.0 221860 964 pts/1 S+ 16:43 0:00 grep --color=auto
job
[1] Terminated control job1
[user@host ~]$ kill -9 5199
[user@host ~]$ ps aux | grep job
user 5205 0.0 0.1 222448 3124 pts/1 S 16:39 0:00 /bin/bash /home/ user/bin/control job3
user 5930 0.0 0.0 221860 1048 pts/1 S+ 16:44 0:00 grep --color=auto
job
[2]- Killed control job2
[user@host ~]$ kill -SIGTERM 5205
user 5986 0.0 0.0 221860 1048 pts/1 S+ 16:45 0:00 grep --color=auto
job
[3]+ Terminated control job3
killall命令可以根據(jù)命令的名稱浊吏,向多個進程發(fā)出信號而昨。
使用 pkill 向一個或多個符合選擇條件的進程發(fā)送信號。選擇標準可以是命令名稱找田、特定用戶擁有的進程配紫,也可以是全系統(tǒng)的所有進程。pkill 命令包括高級選擇標準午阵。
- Command --用模式匹配的命令名稱進行處理躺孝。
- UID - 一個Linux用戶帳戶所擁有的進程,有效或真實的底桂。
- GID - 由Linux組帳戶所擁有的進程植袍,有效或真實。
- Parent -子過程的具體父過程籽懦。
- Terminal -在特定控制終端上運行的過程于个。
[user@host ~]$ ps aux | grep pkill
user 5992 0.0 0.1 222448 3040 pts/1 S 16:59 0:00 /bin/bash /home/ user/bin/control pkill1
user 5996 0.0 0.1 222448 3048 pts/1 S 16:59 0:00 /bin/bash /home/ user/bin/control pkill2
user 6004 0.0 0.1 222448 3048 pts/1 S 16:59 0:00 /bin/bash /home/ user/bin/control pkill3
[user@host ~]$ pkill control
[1] Terminated control pkill1
[2]- Terminated control pkill2
[user@host ~]$ ps aux | grep pkill
user 6219 0.0 0.0 221860 1052 pts/1 S+ 17:00 0:00 grep --color=auto
pkill
[3]+ Terminated control pkill3
[user@host ~]$ ps aux | grep test
user 6281 0.0 0.1 222448 3012 pts/1 S 17:04 0:00 /bin/bash /home/ user/bin/control test1
user 6285 0.0 0.1 222448 3128 pts/1 S 17:04 0:00 /bin/bash /home/ user/bin/control test2
user 6292 0.0 0.1 222448 3064 pts/1 S 17:04 0:00 /bin/bash /home/ user/bin/control test3
user 6318 0.0 0.0 221860 1080 pts/1 S+ 17:04 0:00 grep --color=auto test [user@host ~]$ pkill -U user
[user@host ~]$ ps aux | grep test
user 6870 0.0 0.0 221860 1048 pts/0 S+ 17:07 0:00 grep --color=auto test [user@host ~]$
登出用戶
您可能會因為各種原因而需要將其他用戶注銷。例如:用戶違反了安全規(guī)定暮顺;用戶可能過度使用了資源厅篓;用戶可能有一個沒有反應的系統(tǒng);或者用戶對資料的訪問不當捶码。在這些情況下羽氮,你可能需要使用信號管理終止他們的會話。
要注銷一個用戶惫恼,首先要確定要終止的登錄會話档押。使用w命令列出用戶登錄和當前運行的進程。注意TTY和FROM列,以確定要關閉的會話令宿。
所有用戶登錄會話都與終端設備(TTY)相關聯(lián)叼耙。如果設備名稱的形式為pts/N,則是與圖形化終端窗口或遠程登錄會話相關聯(lián)的偽終端粒没。如果是ttyN形式筛婉,則表示用戶處于系統(tǒng)控制臺、備用控制臺或其他直接連接的終端設備上癞松。
[user@host ~]$ w
12:43:06 up 27 min, 5 users, load average: 0.03, 0.17, 0.66
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty2 12:26 14:58 0.04s 0.04s -bash
bob tty3 12:28 14:42 0.02s 0.02s -bash
user pts/1 desk.example.com 12:41 2.00s 0.03s 0.03s w
[user@host ~]$
通過查看會話登錄時間爽撒,發(fā)現(xiàn)用戶在系統(tǒng)中的時間。對于每個會話拦惋,當前作業(yè)(包括后臺任務和子進程)消耗的CPU資源在JCPU列中。當前前臺進程的CPU消耗在PCPU列中安寺。
進程和會話可以單獨或集體發(fā)出信號厕妖。要終止一個用戶的所有進程,請使用pkill命令挑庶。由于登錄會話中的初始進程(session leader)是為了處理會話終止請求而設計的言秸,并且忽略了不經(jīng)意的鍵盤信號,因此迎捺,要殺死一個用戶的所有進程和登錄外殼举畸,需要使用 SIGKILL 信號。
首先使用pgrep確定要殺死的PID號凳枝,它的操作和pkill很像抄沮,包括使用相同的選項,只是pgrep列出了進程岖瑰,而不是殺死它們叛买。
[root@host ~]# pgrep -l -u bob
6964 bash
6998 sleep
6999 sleep
7000 sleep
[root@host ~]# pkill -SIGKILL -u bob
[root@host ~]# pgrep -l -u bob
[root@host ~]#
當需要關注的進程在同一個登錄會話中,可能沒有必要殺死所有用戶的進程蹋订。使用w命令確定會話的控制終端率挣,然后只殺死引用相同終端ID的進程。除非指定了SIGKILL露戒,否則會話的領導者(這里指的是Bash登錄shell)會成功地處理并存活了終止請求椒功,但所有其他會話進程都會被終止。
[root@host ~]# pgrep -l -u bob
7391 bash
7426 sleep
7427 sleep
7428 sleep[root@host ~]# w -h -u bob bob tty3 18:37 5:04 0.03s 0.03s -bash [root@host ~]# pkill -t tty3
[root@host ~]# pgrep -l -u bob
7391 bash
[root@host ~]# pkill -SIGKILL -t tty3
[root@host ~]# pgrep -l -u bob
[root@host ~]#
使用父進程和子進程關系智什,可以應用同樣的選擇性進程終止动漾。使用pstree命令查看系統(tǒng)或單個用戶的進程樹。使用父進程的PID來殺死它們創(chuàng)建的所有子進程荠锭。這時谦炬,父進程Bash登錄shell存活下來,因為信號只針對它的子進程。
[root@host ~]# pstree -p bob
bash(8391)─┬─sleep(8425)
├─sleep(8426)
└─sleep(8427)
[root@host ~]# pkill -P 8391
[root@host ~]# pgrep -l -u bob
bash(8391)
[root@host ~]# pkill -SIGKILL -P 8391
[root@host ~]# pgrep -l -u bob
bash(8391)
[root@host ~]#
監(jiān)測進程活動
目標
在完成本節(jié)內(nèi)容后键思,你應該能夠描述什么是平均負載础爬,并確定服務器上的高資源使用量的進程。
描述平均負載
負載平均值是Linux內(nèi)核提供的一種測量方法吼鳞,它是一種簡單的表示系統(tǒng)負載隨時間推移而感知到的系統(tǒng)負載的方法看蚜。它可以作為一個粗略的衡量標準,用來衡量系統(tǒng)資源請求的待處理數(shù)量赔桌,并確定系統(tǒng)負載隨著時間的推移是增加還是減少供炎。
每隔5秒,內(nèi)核會根據(jù)可運行和不間斷狀態(tài)下的進程數(shù)量疾党,收集當前的負載數(shù)音诫。這個數(shù)字被累積起來,并以最近1分鐘雪位、5分鐘和15分鐘的指數(shù)移動平均數(shù)來報告竭钝。
了解Linux的平均負載計算
負載平均數(shù)代表了一個時間段內(nèi)可感知的系統(tǒng)負載。Linux通過報告有多少進程準備在CPU上運行雹洗,有多少進程在等待磁盤或網(wǎng)絡I/O完成香罐,來確定這一點。
- 負載數(shù)實質(zhì)上是根據(jù)準備好運行的進程數(shù)(進程狀態(tài)R)和等待I/O完成的進程數(shù)(進程狀態(tài)D)时肿。
- 有些UNIX系統(tǒng)只考慮CPU利用率或運行隊列長度來表示系統(tǒng)負載庇茫。當遇到平均負載高而CPU活動少的情況時,請檢查磁盤和網(wǎng)絡活動螃成。
負載平均數(shù)是一個粗略的測量方法旦签,即當前有多少進程在等待一個請求完成后才能做其他事情。該請求可能是為了CPU時間來運行進程寸宏∏昱或者,這個請求可能是為了完成一個關鍵的磁盤I/O操作击吱,在請求完成之前淋淀,即使CPU處于空閑狀態(tài),進程也不能在CPU上運行覆醇。無論哪種方式朵纷,系統(tǒng)負載都會受到影響,系統(tǒng)的運行速度似乎更慢永脓,因為進程在等待運行袍辞。
解釋顯示的平均負載值
uptime命令是顯示當前平均負載的一種方法。它可以打印出當前時間常摧、機器開機時間搅吁、運行了多少個用戶會話威创,以及當前的平均負載。
[user@host ~]$ uptime
15:29:03 up 14 min, 2 users, load average: 2.92, 4.48, 5.20
負載平均值的三個值代表過去1谎懦、5肚豺、15分鐘內(nèi)的負載。一眼就能看出系統(tǒng)負荷似乎是在增加還是在減少界拦。
如果平均負載的主要貢獻來自于等待CPU的進程吸申,那么可以計算出每個CPU的大致負載值,以確定系統(tǒng)是否有大量的等待享甸。
lscpu命令可以幫助你確定系統(tǒng)有多少個CPU截碴。
在下面的例子中,該系統(tǒng)是一個雙核單套接字系統(tǒng)蛉威,每個核心有兩個超線程日丹。粗略的說涣易,為了調(diào)度的目的壳炎,Linux會把這個系統(tǒng)當作是四核CPU系統(tǒng)。
[user@host ~]$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
...output omitted...
試想一下抽诉,負載數(shù)的唯一貢獻是來自于需要CPU時間的進程齐帚。然后可以將顯示的負載平均值除以系統(tǒng)中的邏輯CPU數(shù)量妒牙。值低于1表示資源利用率令人滿意彼哼,等待時間最小对妄。高于1的值表示資源飽和,并有一定的處理延遲敢朱。
# From lscpu, the system has four logical CPUs, so divide by 4:
# load average: 2.92, 4.48, 5.20
# divide by number of logical CPUs: 4 4 4
# ---- ---- ---# per-CPU load average: 0.73 1.12 1.30
# # This system's load average appears to be decreasing.
# With a load average of 2.92 on four CPUs, all CPUs were in use ~73% of the time.
# During the last 5 minutes, the system was overloaded by ~12%.
# During the last 15 minutes, the system was overloaded by ~30%.
閑置的CPU隊列的負載號為0剪菱,每個等待CPU的進程在負載號上加1的計數(shù)。如果有一個進程在CPU上運行拴签,負載號為1孝常,則該資源(CPU)正在使用中,但沒有請求等待蚓哩。如果該進程運行了整整1分鐘构灸,那么它對1分鐘的負載平均貢獻值為1。
然而岸梨,由于磁盤或網(wǎng)絡資源繁忙導致的關鍵I/O不間斷休眠的進程也被包含在計數(shù)中喜颁,并增加了平均負載。雖然不是CPU利用率的指標曹阔,但這些進程被添加到隊列計數(shù)中半开,因為它們正在等待資源,在獲得資源之前無法在CPU上運行赃份。這仍然是由于資源限制導致進程無法運行的系統(tǒng)負載寂拆。
在資源飽和之前奢米,負載平均數(shù)保持在1以下,因為很少發(fā)現(xiàn)任務會在隊列中等待纠永。只有當資源飽和導致請求繼續(xù)排隊時鬓长,負載平均數(shù)才會增加,并被負載計算例程計算渺蒿。當資源利用率接近100%時痢士,每增加一個請求就開始經(jīng)歷服務等待時間。
一些額外的工具報告負載平均茂装,包括W和top怠蹂。
實時過程監(jiān)控
top程序是系統(tǒng)進程的動態(tài)視圖,顯示一個摘要標題少态,后面是類似于ps信息的進程或線程列表城侧。與靜態(tài)的ps輸出不同,top以可配置的時間間隔持續(xù)刷新彼妻,并提供了列的重新排序嫌佑、排序和高亮顯示功能。用戶的配置可以被保存和持久化侨歉。
默認輸出列可以從其他資源工具中識別:
- 進程ID(PID)屋摇。
- 用戶名(USER)是進程的所有者。
- 虛擬內(nèi)存(VIRT)是進程正在使用的所有內(nèi)存幽邓,包括駐留集炮温、共享庫和任何映射或交換的內(nèi)存頁。(在ps命令中標注為VSZ)牵舵。
- 駐留內(nèi)存(RES)是進程使用的物理內(nèi)存柒啤,包括任何駐留共享對象。(在ps命令中標注為RSS)畸颅。
- 過程狀態(tài)(S)顯示為:
- D = 不間斷睡眠
- R =運行或可運行
- S = 睡眠
- T = 停止或追蹤
- Z =僵尸
- CPU時間(TIME)是進程開始后的總處理時間担巩。可以切換到包括所有前一個子系統(tǒng)的累計時間没炒。
頂部的基本項
KEY | 目的 |
---|---|
? or H | 互動按鍵的幫助涛癌。 |
L, T, M | 切換加載、線程和內(nèi)存頭行送火。 |
1 | 切換顯示單個CPU或標題中所有CPU的摘要拳话。 |
S (1) | 改變刷新(屏幕)率,單位是小數(shù)點后的秒數(shù)(例如漾脂,0.5假颇、1、5)骨稿。 |
B | 為運行中的進程切換反向高亮顯示笨鸡,默認為粗體姜钳。 |
B | 啟用在顯示中、標題中和運行中的進程中使用黑體形耗。 |
Shift+H | 切換線程哥桥;顯示過程總結或單個線程。 |
U, Shift+U | 對任何用戶名進行過濾(有效激涤、真實)拟糕。 |
Shift+M | 按內(nèi)存使用量排序,按內(nèi)存使用量從高到低的順序排列進程列表倦踢。 |
Shift+P | 根據(jù)處理器的使用情況送滞,按處理器的使用情況依次排序。 |
K (1) | 根據(jù)處理器的利用率辱挥,依次排列進程列表犁嗅。當提示時,輸入PID晤碘,然后發(fā)出信號褂微。 |
R (1) | Renice一個過程。當提示時园爷,輸入PID宠蚂,然后輸入nice_value。 |
Shift+W | 寫入(保存)當前顯示配置童社,以便在下一次頂部重啟時使用求厕。 |
Q | 退出 |
Note: | (1) 如果top在安全模式下啟動,則不可用叠洗。見top(1)甘改。 |
總結
進程是一個可執(zhí)行程序的運行實例旅东。進程被分配了一個狀態(tài)灭抑,可以是運行、睡眠抵代、停止或僵尸狀態(tài)腾节。ps命令用于列出進程。
每個終端都是自己的會話荤牍,可以有前臺進程和獨立的后臺進程案腺。jobs命令顯示一個終端會話中的進程。
信號是一種軟件中斷康吵,它向正在執(zhí)行的程序報告事件劈榨。kill、pkill和killall命令使用信號來控制進程晦嵌。
負載平均值是對系統(tǒng)繁忙程度的估計同辣。要顯示負載平均值拷姿,可以使用 top、uptime 或 w 命令旱函。