一、進程的概念
1、內核的公用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等
2、Process(進程):運行中的程序的一個副本,是被載入內存的一個指令集合
進程ID(process ID,PID)號碼被用來標記各個進程
UID,GID和SELinux語境決定文件系統的存取和訪問權限
通常從執行進程的用戶來繼承
存在生命週期
3、Task struct(任務結構):Linux內核存儲進程信息的數據結構格式
4、Task list(任務列表):多個任務的task struct組成的鏈表
5、進程的創建:
系統中的第一個進程時所有的進程的父進程,其它進程都需要在它之下創建進程,與其它進程的關係是父子關係,進程都由其父進程創建第一個進程被殺死其它所有進程都會崩潰
Centos6與之前
Init:第一個進程
Centos7
Systemd:第一個進程
6、進程優先級
進程優先級:數字越小,優先級越高
0-139(centos 4,5)
各有140個運行隊列和過期隊列
0-98,99(centos6,7)
實時優先級:99-0 值越大優先級越高
Nice值:-20-19,對應系統優先級100-139或99
7、Linux內核:搶佔式多任務
8、進程的類型
守護進程:在系統引導過程中啓動的進程,和終端無 關進程
前臺進程:跟終端相關,通過終端啓動的進程
注意:兩者可互相轉化
9、進程狀態
運行態:running
就緒態:ready
睡眠態:可中斷:interruptable
不可中斷:uninterruptable
停止態:stopped,暫停於內存,但不會被調度,除非手動啓動
僵死態:zombie,結束進程,父進程結束前,子進程不關閉
10、進程的分類:
CPU-Bound:CPU密集型,非交互
IO-Bound:IO密集型,交互
11、Linux系統狀態的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
pstree:顯示進程樹(以樹狀圖的方式顯示進程)
ps:查看進程狀態
Linux系統各進程的相關信息均保存在/proc/PID目錄下 的各文件中
二、查看進程ps
ps [選項]
ps支持三種選項:
UNIX選項 如-A -e
BSD選項 如a
GNU選項 如--help
BSD方式
ps 單獨一個ps顯示當前終端上運行的所有進程
a 所有用戶在所有終端上運行的前臺進程
x 當前用戶運行的所有進程(包括前臺進程和後臺daemon)
u 選項顯示進程所有者的信息
k [屬性]: 對屬性排序;例:ps k %cpu 按CPU使用率排序
- - sort [屬性]: 對屬性排序;例:ps - -sort %cpu
ax 所有用戶運行的所有進程
aux 所有用戶運行的所有進程,結果中顯示用戶名
f 顯示父子進程關係
-C <命令關鍵字> :用進程名進行過濾
axo配合
o [屬性]:自定義輸出列,可以跟多個屬性,屬性與屬性之間以逗號分隔
%cpu:CPU使用率
%mem:內存使用率
pid:進程號
uid:進程的所屬用戶的ID號
user:進程所屬主
gid:進程的所屬組的組ID
group:進程所屬組
cmd:命令的參數,命令的字符串;同args一樣
comm:顯示命令的名字
tty:顯示執行終端
ruser:命令的發起人
euser :命令的真正執行行
vsz:虛擬內存集
rss:常駐內存集
stat:進程狀態
ni: nice值
pri: priority 優先級
psr: processor CPU編號
rtprio: 實時優先級
這些屬性就是顯示的自定義的列信息,如下圖紅框所框之處
UNIX方式:
-a 所有用戶在所有終端上運行的前臺進程
-x 當前用戶運行的所有進程(包括前臺進程和後臺daemon)
-ax 所有用戶運行的所有進程
-aux 所有用戶運行的所有進程,結果中顯示用戶名
-f 顯示當前終端上運行的所有進程
-e 顯示所有進程
-f 顯示完整格式程序信息
-F: 顯示更完整格式的進程信息
-H: 以進程層級格式顯示進程相關信息(顯示父子關係)
-ef 以完整格式顯示所有進程
-eF 以更完整格式顯示所有進程
-efH 顯示父子進程關係
-eo 自定義顯示結果,如下
ps -eo %cpu,%mem,pid,nice,pri,stat,comm,vsz,rss,stat
三、進程狀態
STAT :進程狀態
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前臺進程
l: 多線程進程
L:內存分頁並帶鎖
N:低優先級進程
<:高優先級進程
s: session leader,會話(子進程)發起者
四、進程優先級
進程優先級調整
靜態優先級:100-139
進程默認啓動時的nice值爲0,優先級爲120
只有根用戶才能降低nice值(提高優先性)
nice 命令:
nice [選項] pri [cmd [arg]] :在執行命令時設定它的nice值(pri:nice值;cmd:命令;arg:參數)
renice 命令
renice [-n] pri pid:重新設置一個進程的nice值(pri:nice值;pid:進程的進程號)
查看:
ps axo ni:查看nice值
五、搜索進程
最靈活:ps 選項 |其他命令
按預定義的模式:pgrep(pgrep僅適用於匹配進程信息)
pgrep [option] pattern
-u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名
-P pid: 顯示指定進程的子進程
按確切的程序名稱:/sbin/pidof
pidof bash :根據命令名來搜索出該命令的進程的pid(bash:命令名)
六、系統工具
uptime
顯示當前時間,系統已啓動的時間、當前上線人數,系統平均負載(1、5、10分鐘的平均負載,一般不會超過1)
系統平均負載:
指在特定時間間隔內運行隊列中的平均進程數
通常每個CPU內核的當前活動進程數不大於3,那麼系統的性能良好。如果每個CPU內核的任務數大於5,那麼此主機的性能有嚴重問題
如果Linux主機是1個雙核CPU,當load average爲6的時候說明機器已經被充分使用
七、進程管理工具top
ps 這個工具查看進程只是臨時的,只能查詢出執行命令那一刻的所有進程,卻不是實時刷新的,有些死板,下面介紹一個top工具,它可以實時查詢進程信息,更加方便我們的管理
1、使用top 的語法
top [選項] [參數]
-d #:指定刷新時間間隔,#秒刷新一次,單位爲秒,默認爲3秒
-b:全部顯示所有進程
-n # :刷新多少次後退出
2、top:實時查看進程信息,有許多內置命令
排序:
P:以佔據CPU百分比,%CPU
M:佔據內存百分比,%MEM
T:累積佔據CPU時長,TIME+
首部信息顯示:
l:uptime信息
t:tasks及CPU信息
1:CPU分別顯示
m:memory信息(內存)
q:退出命令
s:修改刷新時間間隔
k:終止指定進程
W:保存文件
3、欄位信息簡介
us:用戶空間
sy:內核空間
ni:調整
nice時間
id:空閒
wa:等待IO時間
hi:硬中斷
si:軟中斷(模式切換)
st:虛擬機偷走的時間
八、高級進程管理htop
除了top外還有一個top的增強版命令htop,系統默認情況下沒有安裝,需要epel源來進行安裝,這裏不做epel的配置,直接通過yum install htop命令進行安裝,安裝後直接執行htop命令即可,htop較之top有了顏色,顯示界面上也更加好看。
1、htop [選項] [參數]
-d #: 指定延遲時間;#秒後
-u UserName: 僅顯示指定用戶的進程
-s COLUME: 以指定字段進行排序
2、htop模式下的子命令
s: 跟蹤選定進程的系統調用
l: 顯示選定進程打開的文件列表
a:將選定的進程綁定至某指定CPU核心
t: 顯示進程樹
#:快速定位光標至PID爲#的進程上
h:幫助信息,顯示該模式下的所有子命令
q:退出
九、 動態顯示系統資源的使用情況vmstat
vmstat命令主要用來動態的顯示當前系統資源的使用情況,也就是虛擬內存信息,這些資源包括:內存、磁盤、網絡、cpu等資源。
1、用法:vmstat [選項] [參數]
-s:將一些時間導致的內存變化情況列表說明
-S:後面可以跟單位;如K、M取代bytes的容量;例:vmstat -S K
-d:列出磁盤的讀寫總量統計表
#1 #2:#1,#2是兩個數字,#1秒刷新一次,刷新#2次,將刷新的當前系統資源的使用情況顯示出來
2、每一行所代表的含義:
procs:
r:可運行(正運行或等待運行)進程的個數,和核心數有關
b:處於不可中斷睡眠態的進程個數(被阻塞的隊列的長度)
memory:
swpd: 交換內存的使用總量
free:空閒物理內存總量
buffer:用於buffer的內存總量
cache:用於cache的內存總量
swap:
si:從磁盤交換進內存的數據速率(kb/s)
so:從內存交換至磁盤的數據速率(kb/s)
io:
bi:從塊設備讀入數據到系統的速率(kb/s)
bo: 保存數據至塊設備的速率
system:
in: interrupts 中斷速率,包括時鐘
cs: context switch 進程切換速率
cpu:
us:user space,用戶運行程序佔用CPU的百分比
sy: system(kernel space),用於運行內核佔用CPU的百分比
id: idle,空閒CPU百分比
wa: wait IO,等待I/O花費時間
st: stolen,被虛擬機‘偷走’的百分比
十、統計CPU和設備IO信息
Iostat:統計CPU和設備IO信息
示例:iostat 1 10 :每一秒刷新一次統計出的CPU和設備信息,並顯示10次後自動退出
十一、進程對應的內存映射
pmap命令用來顯示當前正在運行的某一個進程所對應使用的內存的映射
pmap [選項] PID [...]
-x:顯示詳細格式的信息
示例:pmap 1:顯示進程號爲1的進程對應的內存映射
另一種實現方法
cat /proc/PID/maps :PID爲要查看的進程的PID
十二、系統監控工具glances
glances是一款用於Linux、BSD的開源命令行系統監控工具,它使用Python語言開發,能夠見識CPU、負載、內存、磁盤I/O、網絡流量、文件系統、系統溫度等信息,優點是glances可以實時的顯示重要的系統信息,並每隔2秒動態刷新,它也不會消耗大量的CPU資源;但是glances在默認情況下並不會安裝,需要自行安裝,
1、Glances可以爲Unix和Linux性能專家提供監視和分析性能數據的功能,其中包括:
1.CPU使用率
2.內存使用情況
3.內核統計信息和運行隊列信息
4.磁盤I/O速度、傳輸和讀/寫比率
5.文件系統中的可用空間
6.磁盤適配器
7.網絡I/O速度、傳輸和讀/寫比率
8.頁面空間和頁面信息
9.消耗資源最多的進程
10.計算機信息和系統信息
2、glances的使用方法及常用的選項
-b: 以Byte爲單位顯示網卡數據速率
-d: 關閉磁盤I/O模塊
-f /path/to/somefile: 設定輸入文件位置
-o {HTML|CSV}:輸出格式
-m: 禁用mount模塊
-n: 禁用網絡模塊
-t #: 延遲時間間隔
-1:每個CPU的相關數據單獨顯示
3、C/S模式下運行glances命令
glances支持遠程模式,即可以以C/S模式工作
服務器模式:
glances -s -B IP
IP:指明監聽的本機哪個地址
客戶端模式:
glances -c IP
IP:要連入的服務器端地址
十三、系統資源統計
dstat命令是一個可以取代vmstat,iostat,netstat和ifstat這些命令的多功能產品,dstat可以實時的看到所有系統資源,以列表的形式爲你提供選項信息並清晰地告訴你是在何種幅度和單位顯示輸出,默認情況下每秒刷新一次,並顯示結果Ctrl+C退出,dstat在centos6和centos7系統上默認情況下是沒有被安裝的,需要自行安裝後使用
1、dstat命令的選項
短選項
-c: 顯示cpu相關信息
-C #,#,...,total
-d: 顯示disk相關信息
-D total,sda,sdb,...
-g:顯示page相關統計數據
-m: 顯示memory相關統計數據
-n: 顯示network相關統計數據
-p: 顯示process相關統計數據
-r: 顯示io請求相關的統計數據
-s: 顯示swapped相關的統計數據
長選項
- -tcp:顯示tcp套接字的相關的數據
- -udp:顯示udp套接字的相關的數據
- -unix:顯示unix sock接口相關的統計數據
- -raw:顯示raw套接字的相關的數據
- -socket:
- -ipc:顯示進程間通信相關的速率數據
- -top-cpu:顯示最佔用CPU的進程
- -top-io: 顯示最佔用io的進程
- -top-mem: 顯示最佔用內存的進程
- -top-latency: 顯示延遲最大的進程
2、dstat命令顯示的每一行信息
Total-cpu-usage:cpu的使用率
Dsk/total:磁盤讀寫速度
Net/total:網絡設備發送和接收的數據總數
Paging:系統的分頁活動,分頁指的是一種內存管理技術用於查找系統場景,一個較大的分頁表明系統正字使用大量的交換空間,或者說內存非常分散,大多數情況下你都希望看到page in(換入)和page out(換出)的值是0 0.
System:這一項顯示的是中斷(int)和上下文切換(csw)。這項統計僅在有比較基線時纔有意義。這一欄中較高的統計值通常表示大量的進程造成擁塞,需要對CPU進行關注。服務器一般情況下都會運行一些程序,所以這項總是顯示一些數值。
十四、進程管理工具kill
所謂進程管理就是向進程發送一些控制信號,來完成對進程的管理控制,我們可以通過kill 命令來顯示當前系統可用的信號,以及向進程發送信號指令
1、顯示當前系統可用信號
kill -l :顯示當前系統可用信號
trap -l:顯示當前系統可用信號
常用的信號:
SIGHUP:1, 無須關閉進程而讓其重讀配置文件
SIGINT:2, 中止正在運行的進程;相當於Ctrl+c
SIGQUIT:3,相當於ctrl+\
SIGKILL:9, 強制殺死正在運行的進程
SIGTERM:15,終止正在運行的進程
SIGCONT:18,繼續運行
SIGSTOP:19,後臺休眠
2、指定信號的方法
1.完整名稱,例如SIGINT
2.簡寫名稱,例如INT
3.數據代稱,例如2
3、指定進程的方法
1.按PID:kill [-SIGNAL] pid
僅能管理一個進程
2.按名稱:killall [-SIGNAL] cmd
可以管理所有的關於cmd的進程,包括不同終端的cmd進程
3.按模式:pkill [-SIGNAL] [選項] pattern
-SIGNAL(可以省略,省略時默認爲9 SIGKILL)
選項
-u uid: 生效者的進程
-U uid: 真正發起運行命令者的進程
-t terminal: 與指定終端相關的進程,例:pkill -t pts/1
-l: 顯示進程名(pgrep可用)
-a: 顯示完整格式的進程名(pgrep可用)
-P pid: 顯示指定進程的子進程
十五、作業管理
1、Linux的作業控制
前端作業:通過終端啓動,且啓動後一直佔據終端
後臺作業:可通過終端啓動,但啓動後即轉入後臺運行(釋放終端)
2、讓前臺作業運行於後臺
1.運行中的作業:Ctrl +Z(中斷進程,使其不再運行,但依然在後臺有這個進程)
2.尚未啓動的作業:cmd &(在後臺執行該命令,但是依然在終端上顯示執行結果,但不影響在終端上輸入其他命令並執行)
後臺作業雖然被送往後臺運行,但其依然與終端相關;退出終端,將關閉後臺作業,如果希望送往後臺且剝離與終端的關係.
nohup COMMAND &>/dev/null &
screen;COMMAND
3、查看當前終端所有作業:jobs
4、作業控制:
fg [[%]JOB_NUM]:把指定的後臺作業調回前臺
bg [[%]JOB_NUM]:讓送往後臺的作業在後臺繼續運行
kill [%JOB_NUM]: 終止指定的作業(JOB_NUM:作業號)
5、並行運行多個進程,提高效率
方法1
把其它需要運行的所有命令編輯到多個腳本中,然後在編輯一個腳本,在這個腳本里執行所有的腳本
vim all.sh
F1.sh&
F2.sh&
F3.sh&
方法2
編寫多個腳本,在命令行中寫一行一次性執行所有的腳本
(f1.sh&);(f2.sh&);(f3.sh&)
方法3
{ f1.sh& f2.sh& f3.sh& }