程序管理
- 一、檢視控制程序
-
-
- 1、ps檢視靜态程序統計資訊(Processes Statistic)
- 2、top檢視程序動态資訊
- 3、pgrep查詢程序資訊
- 4、pstree檢視程序樹、
-
- 二、程序控制
-
-
- 1、啟動以及改變運作程序方式
-
-
- 1)手動啟動程序方式
- 2)排程啟動程序方式
- 3)改變程序的運作方式(Ctrl+Z)
- 4)檢視背景的程序(jobs)
- 5)将背景的程序恢複運作(fg)
-
- 2、終止執行程序(kill、killall 和 pkill)
-
-
- 1)使用 kill 指令終止程序
- 2)使用 killall 指令終止程序
- 3)使用 pkill 指令終止程序
-
-
一、檢視控制程序
程式是儲存在外部存儲媒體(如硬碟)中的可執行機器代碼和資料的靜态集合,而程序 是在 CPU 及記憶體中處于動态執行狀态的計算機程式。在 Linux 作業系統中,每個程式啟動後可以建立一個或多個程序。
1、ps檢視靜态程序統計資訊(Processes Statistic)
ps 指令是 Linux 作業系統中最為常用的程序檢視工具,主要用于顯示包含目前運作的各程序完整資訊的靜态快照。
ps 指令常用選項
選項 | 注釋 |
---|---|
a | 顯示目前終端下的所有程序資訊,包括其他使用者的程序。與“x”選項結合時将顯 示系統中所有的程序資訊。 |
u | 使用以使用者為主的格式輸出程序資訊。 |
x | 顯示目前使用者在所有終端下的程序資訊。 |
-e | 顯示系統内的所有程序資訊。 |
-l | 使用長(Long)格式顯示程序資訊。 |
-f | 使用完整的(Full)格式顯示程序資訊。 |
**注:**ps 指令中常用的幾個選項,有一部分選項是不帶“-”字首的(添加“-”字首後含義可能會有出入)。習慣上将上述選項組合在一起使用,執行“ps aux”或“ps -elf”指令。
[[email protected] ~]# ps
PID TTY TIME CMD
18695 pts/0 00:00:00 bash
18804 pts/0 00:00:00 ps
//直接執行不帶任何選項的 ps 指令時,将隻顯示目前使用者會話中打開的程序
[[email protected] ~]# ps aux //以簡單清單的形式顯示出系統程序資訊
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 191044 4128 ? Ss 02:46 0:02 /usr/lib/systemd/systemd --
root 2 0.0 0.0 0 0 ? S 02:46 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 02:46 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 02:46 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 02:46 0:01 [kworker/u256:0]
root 7 0.0 0.0 0 0 ? S 02:46 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 02:46 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 02:46 0:02 [rcu_sched]
··········
- USER:啟動該程序的使用者賬号的名稱。
- PID:該程序在系統中的數字 ID 号,在目前系統中是唯一的。
- %CPU:CPU 占用的百分比。
- %MEM:記憶體占用的百分比。
- VSZ:占用虛拟記憶體(swap 空間)的大小。
- RSS:占用常駐記憶體(實體記憶體)的大小。
- TTY:表明該程序在哪個終端上運作。“?”表示未知或不需要終端。
- STAT:顯示程序目前的狀态,如 S(休眠)、R(運作)、Z(僵死)、<(高優先級)、N(低優先級)、s(父程序)、+(前台程序)。對處于僵死狀态的程序應該予以手動終止。
- START:啟動該程序的時間。
- TIME:該程序占用的 CPU 時間。
- COMMAND:啟動該程序的指令的名稱。
[[email protected] ~]# ps -elf //以長格式顯示系統中的程序資訊
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 47761 ep_pol 02:46 ? 00:00:02 /usr/lib/systemd
1 S root 2 0 0 80 0 - 0 kthrea 02:46 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 02:46 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 02:46 ? 00:00:00 [kworker/0:0H]
1 S root 6 2 0 80 0 - 0 worker 02:46 ? 00:00:01 [kworker/u256:0]
1 S root 7 2 0 -40 - - 0 smpboo 02:46 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 02:46 ? 00:00:00 [rcu_bh]
1 S root 9 2 0 80 0 - 0 rcu_gp 02:46 ? 00:00:02 [rcu_sched]
5 S root 10 2 0 -40 - - 0 smpboo 02:46 ? 00:00:00 [watchdog/0]
// PPID 列(表示對應程序的父程序的 PID 号)
2、top檢視程序動态資訊
使用 ps 指令檢視到的是一個靜态的程序資訊,并不能連續地回報出目前程序的運作狀态。若希望以動态重新整理的方式顯示各程序的狀态資訊,可以使用 top 指令。top 指令将會在目前終端以全屏互動式的界面顯示程序排名,及時跟蹤包括 CPU、記憶體等系統資源占用情況,預設情況下每三秒鐘重新整理一次,其作用基本類似于Windows 作業系統中的任務管理器。
[[email protected] ~]# top
top - 23:21:33 up 20:35, 2 users, load average: 0.08, 0.03, 0.05
Tasks: 211 total, 1 running, 210 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3865308 total, 1219320 free, 862384 used, 1783604 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 2687068 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 191044 4128 2516 S 0.0 0.1 0:02.51 systemd
···················
系統任務(Tasks)資訊 | CPU 占用資訊 | 記憶體占用(Mem)資訊 | 交換空間(Swap)占用 |
---|---|---|---|
total,總程序數 | us,使用者占用 | total,總記憶體空間 | buff/cache,實體記憶體和交換記憶體的緩沖區總和 |
running,正在運作的程序數 | sy,核心占用 | free,空閑記憶體 | free,空閑交換空間 |
sleeping, 休眠的程序數 | ni,優先級排程占用 | used,已用記憶體 | used,已用交換空間 |
stopped,中止的程序數 | id,空閑CPU% | buff/cache,實體記憶體和交換記憶體的緩沖區總和 | avail Mem,可用實體空間 |
zombie,僵死無響應的程序數 | wa,I/O 等待占用 | ||
hi,硬體中斷占用 | |||
si,軟體中斷占用 | |||
st,虛拟化占用 |
top 指令的全屏操作界面
- 按 P 鍵根據 CPU 占用情況對程序清單進行排序
- 按 M 鍵根據記憶體占用情況進行排序
- 按 N 鍵根據啟動時間進行排序
- 按 h 鍵可以獲得 top 程式的線上幫助資訊
- 按q 鍵可以正常地退出 top 程式
按top 排名工具發現某個程序 CPU 占用率非常高,需要終止該程序的運作,可以在 top 操作界面中按 k 鍵,然後在清單上方将會出現“PID to signal/kill [default pid = 3180]:” 的提示資訊,根據提示輸入指定程序的 PID 号并按 Enter 鍵, 出現“Send pid 5597 signal [15/sigterm]”的二次确認的提示資訊,然後按Enter 鍵确認即可終止對應的程序。
3、pgrep查詢程序資訊
[[email protected] ~]# pgrep -l ssh
1024 sshd
2853 ssh-agent
18693 sshd
[[email protected] ~]# pgrep -l -U root -t pts/0
18695 bash
- “-l”選項可同時輸出對應的程序名(否則隻輸出 PID 号,不便于了解)
- “-U”選項查詢特定使用者的程序
- “-t”選項查詢在特定終端運作的程序
4、pstree檢視程序樹、
- pstree 指令可以輸出 Linux 作業系統中各程序的樹形結構,以更加直覺地判斷各程序之間的互相關系(父程序、子程序)。
[[email protected] ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─2*[abrt-watch-log]
············
[[email protected] ~]# pstree -aup
systemd,1 --system --deserialize 13
├─ModemManager,752
│ ├─{ModemManager},770
│ └─{ModemManager},779
├─NetworkManager,6600 --no-daemon
··············
[[email protected] ~]# pstree -ap wu
bash,19406
“-p” 選項使用時可以同時列出對應的 PID 号
“-u”選項可以列出對應的使用者名
“-a”選項可以列出完整的指令資訊
二、程序控制
1、啟動以及改變運作程序方式
1)手動啟動程序方式
前台啟動程序:使用者手工輸入指令或者可執行程式的路徑,啟動的程序
啟動背景程序:需要使用“&”操作符,将“&”操作符放在要執行指令的最後面,程序啟動後會直接放入背景運作,而不占用前台的指令操作界面,友善使用者進行其他操作。
2)排程啟動程序方式
程序的排程啟動可以通過 at、crontab 指令進行設定,排程啟動的計劃任務程序均在背景運作,不會占用使用者的指令終端。
3)改變程序的運作方式(Ctrl+Z)
挂起目前的程序
- 當 Linux 作業系統中的指令正在前台執行時(運作尚未結束),按 Ctrl+Z 組合鍵可以将目前程序挂起(調入背景并停止執行),這種操作在需要暫停目前程序并進行其他操作時用。
4)檢視背景的程序(jobs)
-
需要檢視目前終端中在背景運作的程序任務時,可以使用 jobs 指令,結合“-l”選項可以同時顯示該程序對應的 PID 号。在 jobs 指令的輸出結果中,每一行記錄對應一個背景程序的狀态資訊,行首的數字表示該程序在背景的任務編号。若目前終端沒有背景程序,将不會顯示任何資訊。
[[email protected] ~]# jobs -l
5)将背景的程序恢複運作(fg)
- 使用 bg(BackGround,背景)指令,可以将背景中暫停執行(如按 Ctrl+Z 組合鍵挂起)的任務恢複運作,繼續在背景執行操作
- 使用 fg 指令(ForeGround,前台),可以将背景任務重新恢複到前台運作
-
除非背景中的任務隻有一個,否則 bg 和 fg 指令都需要指定背景程序的任務編号作為參數。
[[email protected] ~]# fg 1
2、終止執行程序(kill、killall 和 pkill)
1)使用 kill 指令終止程序
通過 kill 指令終止程序時,需要使用程序的 PID 号作為參數。無特定選項時,kill 指令将給該程序發送終止信号并正常退出運作,若該程序已經無法響應終止信号,則可以結合“-9” 選項強行終止程序。強制終止程序時可能會導緻程式運作的部分資料丢失,是以不到不得已時不要輕易使用“-9”選項。
[[email protected] ~]# pgrep -l "sshd" //查詢目标程序的PID 号
5822 sshd
[[email protected] ~]# kill 5822 //終止指定PID 的程序
[[email protected] ~]# pgrep -l "sshd" //确認程序已終止(查詢時無結果)
[[email protected] ~]# vim file //打開vim 程式并挂起作為測試
[1]+ Stopped vim file
[[email protected] ~]# jobs -l //查詢目标程序的PID 号
[1]+ 7095 Stopped vim file
[[email protected] ~]# kill 7095 //嘗試正常結束程序
[[email protected] ~]# jobs -l //但發現vim 程序并未退出
[1]+ 7095 Stopped vim file
[[email protected] ~]# kill -9 7095 //強制終止目标程序
[[email protected] ~]# jobs -l //成功終止vim 程序
[1]+ 2993 已 殺死 vim file
2)使用 killall 指令終止程序
- killall 指令可以通過程序名稱來終止程序,當需要結束系統中多個相同名稱的程序時,使用 killall 指令将更加友善,效率更高。
[[email protected] ~]# vim file1 //挂起第 1 個 vim 測試程序
[1]+ Stopped vim file1
[[email protected] ~]# vim file2 //挂起第 2 個 vim 測試程序
[2]+ Stopped vim file2
[[email protected] ~]# jobs -l //确認待終止的程序資訊
[1]- 7144 Stopped vim file1
[2]+ 7153 Stopped vim file2
[[email protected] ~]# killall -9 vim //通過程序名終止多個程序
[[email protected] ~]# jobs -l
[1]- 7144 Killed vim file1
[2]+ 7153 Killed vim file2
3)使用 pkill 指令終止程序
- 使用 pkill 指令可以根據程序的名稱、運作該程序的使用者、程序所在的終端等多種屬性終止特定的程序,“-U”(指定使用者)、“-t”(指定終端)
[[email protected] ~]# pgrep –l -U "wlm" //确認目标程序相關資訊
3773 bash
[[email protected] ~]# pkill -9 -U "wlm" //強行終止使用者hackli 的程序
[[email protected] ~]# pgrep -l -U "wlm" //确認目标程序已被終止