一、Linux進程概念
1.進程:Process,是運行中的程序的一個副本,有生命週期,都由其父進程創建
Linux內核存儲進程信息的固定格式:taskstruct
多個任務的的taskstruct組件的鏈表:task list
2.進程優先級:0-139
0:一般不使用
1-99:實時優先級;數字越大優先級越高,系統自動安排
100-139:靜態優先級;數字越小優先級越高,可手動更改
3.Nice值:-20至19,對應於100到139
普通用戶只能將自己的優先級調低,root用戶可以隨意調製
每個隊列有兩對:運行隊列、過期隊列,140對280隊,通過CPU中斷控制來給進程運行時間
4.進程內存
內存是以Page Frame:頁框的方式存儲頁面數據
每個內存頁框的MMU(Memory Management Unit,內存管理單元)的大小一般爲4k
進程在內存上的存儲單元可能是不連續的
5.IPC:Inter Process Communication進程間通信
同一主機上:signal信號、shm: shared memory共享內存、semerphor旗語手勢
不同主機上:rpc: remote procecure call遠程過程調用、socket套接字
6.進程類型
守護進程:在系統引導過程中啓動的進程,跟終端無關的進程;
前臺(用戶)進程:跟終端相關,通過終端啓動的進程
注意:也可把在前臺啓動的進程送往後臺,以守護模式運行;
7.進程狀態
運行態:running,進程佔用CPU,並在CPU上運行;
就緒態:ready,進程已經具備運行條件,但是CPU還沒有分配過來;
可中斷睡眠態:處於這個狀態的進程因爲等待某某事件的發生(比如等待socket連接、等待信號量),而被掛起。這些進程的task_struct結構被放入對應事件的等待隊列中。當這些事件發生時(由外部中斷觸發、或由其他進程觸發),對應的等待隊列中的一個或多個進程將被喚醒。
不可中斷睡眠:進程處於睡眠狀態,但是此刻進程是不可中斷的。不可中斷,指的並不是CPU不響應外部硬件的中斷,而是指進程不響應異步信號。絕大多數情況下,進程處在睡眠狀態時,總是應該能夠響應異步信號的。但是有延遲
可中斷:interruptable
不可中斷:uninterruptable,不可中斷,指的並不是CPU不響應外部硬件的中斷,而是指進程不響應異步信號。
停止態:暫停於內存中,但不會被調度,除非手動啓動之;stopped
僵死態:zombie,結束進程,父進程結束前,子進程不關,不可被kill, 即不響應任務信號, 無法用SIGKILL殺死
8.進程的分類
CPU-Bound:cpu密集型,對CPU佔用大,非交互式的佔用大
IO-Bound:io密集型,對io佔用大,交互式的佔用大
9.進程的數字標識16bits:
0-65535:有效使用1-65535
1-1023:固定分配,服務器使用,而且只有管理員有權限啓用;
1024-4W:半固定,服務,如mysql等
4W+:臨時;標識臨時通信進程
10.CentOS 5/6/7的啓動進程
CentOS 5: SysV init,在系統啓動和創建進程藉助腳本,串行啓動,速度慢
CentOS 6:upstart,在5的基礎上升級,同爲腳本啓動,但時可以支持並行啓動
CentOS 7:systemd,並行,以systemd爲單一進程同時啓動其他進程
二、進程管理相關命令
1.pstree:進程樹查看
常用選項:
-p:打印個進程的pid
實例:
[root@young ~]# pstree -p systemd(1)─┬─abrt-watch-log(791) ├─abrt-watch-log(799) ├─abrtd(788) ├─alsactl(785) ├─at-spi-bus-laun(88842)─┬─dbus-daemon(88859) │ ├─{at-spi-bus-laun}(88846) │ ├─{at-spi-bus-laun}(88852) │ └─{at-spi-bus-laun}(88865) ├─at-spi2-registr(88871)───{at-spi2-registr}(88873) ...
2.ps:process state,查看當前進程狀態
Linux各進程的相關信息在/proc目錄有一個以其PID命令的目錄下的衆多文件中.
常用選項:
a:所有與終端相關的進程; x:所有與終端無關的進程; u:以用戶爲中心組織進程狀態信息顯示 -e:顯示所有進程 -f:顯示完整格式的進程信息 -F:顯示完整格式的進程信息; -H:以層級(樹狀)結構顯示進程的相關信息; o field1, field2,...:自定義要顯示的字段列表,以逗號分隔;
實例:
1) # ps aux:顯示所有與終端有無關聯的進程信息,一用戶爲中心組織狀態信息顯示
[root@young ~]# ps aux | head -5 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 128892 8792 ? Ss Feb06 3:34 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ? S Feb06 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S Feb06 0:14 [ksoftirqd/0] root 7 0.0 0.0 0 0 ? S Feb06 0:00 [migration/0]
說明:
USER:運行該進程的用戶
PID:進程的ID號碼
%CPU:CPU的佔用百分比
%MEM:內存空間佔用比率,佔用整個內存空間的比例
VSZ(Virutal memory SiZe):虛擬內存集;佔用的虛擬內存大小,真正用來佔用的內存
每個內存佔用的內存有兩種:線性內存空間、物理內存空間
線性內存:會映射到物理內存,在線性內存空間角度看是連續的內存佔用
物理內存:實際上是以內存頁框保存,可能一個進程佔用的不連續的頁框
RSS:ResidentSize,常駐內存集;堅決不能轉換到swap中內存集
TTY:運行終端
STAT:當前進程的運行狀態,BSD樣式
R:running,運行態
S:interruptable sleeping,可中斷睡眠
D:uninterruptable sleeping,不可中斷睡眠
T:Stopped,停止狀態
Z:zombie,僵死狀態,進程結束後,在被回收之前狀態
+:表示一個前臺進程,佔據命令提示符
l:多線程進程
N:低優先級進程
<:高優先級進程
s:session leader ,回話主導進程,如shell,其主導其下的進程
START:進程開始時間
TIME:累計運行CPU時間
COMMAND:使用進程、線程,[]: 內核線程
2) # ps -ef:以完整格式顯示所有的進程信息
[root@young ~]# ps -ef|head -5 UID PID PPID C STIME TTY TIME CMD root 1 0 0 Feb06 ? 00:03:35 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0 0 Feb06 ? 00:00:00 [kthreadd] root 3 2 0 Feb06 ? 00:00:14 [ksoftirqd/0] root 7 2 0 Feb06 ? 00:00:00 [migration/0]
說明:
UID:啓動進程用戶
PID:運行進程號
PPID:父進程的進程號,0在內核啓動init之前存在,init啓動後終止,存在過渡,一般爲swap的進程
C:cpu utilization,CPU的佔用百分比
STIME:啓動時間
TTY:與其終端相關
TIME:累計運行CPU時間
CMD:啓動此進程的命令
3) # ps -eFH:樹狀層級結構顯示
F比f顯示的信息更加全面,層級結構顯示,縮進相同同層級
PSR:運行在哪顆CPU上,十進制編號,0/1/2/3
[root@young ~]# ps -eFH|head -5 UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 2 0 0 0 0 0 Feb06 ? 00:00:00 [kthreadd] root 3 2 0 0 0 0 Feb06 ? 00:00:14 [ksoftirqd/0] root 7 2 0 0 0 0 Feb06 ? 00:00:00 [migration/0] root 8 2 0 0 0 0 Feb06 ? 00:00:00 [rcu_bh]
4) # ps -eo , #ps axo顯示自定義字段列表
o field1, field2,...:自定義要顯示的字段列表,以逗號分隔,o要寫在後面,因爲要帶參數
常用的field:pid,ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio
ni:nice值;
priority:priority,優先級;
rtprio:realtime priority,實時優先級;
[root@young ~]# ps axo pid,ni,pri,psr|head -5 PID NI PRI PSR 1 0 19 0 2 0 19 0 3 0 19 0 7 - 139 0 [root@young ~]# ps -eo pid,ni,pri|head -5 PID NI PRI 1 0 19 2 0 19 3 0 19 7 - 139
3.pgrep命令
用法:
pgrep [OPTIONS] [PATTERN]
注:PATTERN: 支持正則表達元字符書寫模式實現進程過濾;
常用選項:
-U UID:僅顯示由指定用戶身份運行的進程PID -G GID:僅顯示以指定組身份運行的進程PID -t term: 僅顯示指定的終端設備的進程PID -l: 顯示進程PID的同時顯示進程名 -a: 顯示完整格式的進程名 -u uid: effective user,生效者 -P pid: 顯示指定進程的子進程
實例:
1)顯示以root身份運行的進程的PID
[root@young ~]# pgrep -U root|head -5 1 2 3 7 8
2)顯示以root組身份運行的進程的PID
[root@young ~]# pgrep -G root|head -5 1 2 3 7 8
3)顯示以tty1終端運行的進程PID
[root@young ~]# pgrep -t tty1 88406 88472 88494 88495
4)顯示以root身份運行,root組運行,且終端爲tty1進程的PID與進程名
[root@young ~]# pgrep -U root -G root -t tty1 -l 88406 bash 88472 startx 88494 xinit 88495 X
5)使用正則表達式做模式匹配
[root@young ~]# pgrep "\<bash\>" -l 19320 bash 88406 bash 125591 bash
4.pidof:根據進程名獲取其PID;
格式:
pidof PROGRAM
實例:
[root@young ~]# pidof bash 125591 88406 81122 19320
5.top:display Linuxprocesses,動態顯示進程信息
格式:
top [OPTION]
常用選項:
-d #:指定刷新時間間隔,默認爲3秒; -b:以批次方式顯示; -n #:顯示多少批次; -p PID:通過指定監控進程ID來僅僅監控某個進程的狀態。 -c:顯示整個命令行而不只是顯示命令名 -i: 使top不顯示任何閒置或者僵死進程
常用交互式命令:
(1)在top顯示過程中通過交互式命令指定排序(默認CPU):
P: 按照CPU百分比大小將進程降序排序
M:Memory佔用量大小將進程降序排序
T:CPU累積時間佔用量將進程降序排序
(2)首部信息關閉
l: top行信息是否顯示;
t:是否顯示進程及CPU相關的信息
1:是否單獨顯示每顆CPU的使用率
m: 是否顯示內存及swap相關的信息
(3)其他命令
q: 退出top
s: 修改刷新時間間隔;
k: 殺死指定進程
L:搜索字符串
說明:
load avg:
CPU上等待運行的進程隊列的隊列長度; 過去1分鐘、5分鐘、15分鐘的平均長度;
cpu(s)行解釋:
us: user space,用戶空間佔用CPU百分比 sy: system,內核空間佔用CPU百分比 ni: nice,用戶進程空間內改變過優先級的進程佔用CPU百分比 id: idle,空閒CPU百分比 wa: waiting io,等待輸入輸出的CPU時間百分比 hi: hardware interrupt,硬件CPU中斷佔用百分比 si: software interrupt,軟件CPU中斷佔用百分比 st: stolen,虛擬機佔用百分比
默認上,top顯示這些關於進程的屬性:
PID
進程ID,進程的唯一標識符
USER
進程所有者的實際用戶名。
PR
進程的調度優先級。這個字段的一些值是'rt'。這意味這這些進程運行在實時態。
NI
進程的nice值(優先級)。越小的值意味着越高的優先級。
VIRT
進程使用的虛擬內存。
RES
駐留內存大小。駐留內存是任務使用的非交換物理內存大小。
SHR
SHR是進程使用的共享內存。
S
這個是進程的狀態。它有以下不同的值:
D - 不可中斷的睡眠態。 R – 運行態 S – 睡眠態 T – 被跟蹤或已停止 Z – 殭屍態
%CPU
自從上一次更新時到現在任務所使用的CPU時間百分比。
%MEM
進程使用的可用物理內存百分比。
TIME+
任務啓動後到現在所使用的全部CPU時間,精確到百分之一秒。
COMMAND
運行進程所使用的命令。
還有許多在默認情況下不會顯示的輸出,它們可以顯示進程的頁錯誤、有效組和組ID和其他更多的信息。
實例:
[root@young ~]# top top - 01:21:28 up 9 days, 19:36, 3 users, load average: 0.07, 0.08, 0.06 Tasks: 419 total, 2 running, 417 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.6 us, 1.9 sy, 0.0 ni, 96.4 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 3098484 total, 281664 free, 566888 used, 2249932 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 2393584 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 6851 root 20 0 0 0 0 S 6.2 0.0 0:07.28 kworker/0:1 84869 root 20 0 146412 2240 1368 R 6.2 0.1 0:00.01 top 1 root 20 0 128996 8856 1712 S 0.0 0.3 3:37.38 systemd # top //每隔3秒顯式所有進程的資源佔用情況 # top -d 2 //每隔2秒顯式所有進程的資源佔用情況 # top -c //每隔3秒顯式進程的資源佔用情況,並顯示進程的命令行參數(默認只有進程名) # top -p 12345 -p 6789//每隔5秒顯示pid是12345和pid是6789的兩個進程的資源佔用情況 # top -d 2 -c -p 123456 //每隔2秒顯示pid是12345的進程的資源使用情況,並顯式該進程啓動的命令行參數
更加詳細內容: http://www.cnblogs.com/qiwenhui/articles/4262044.html
注:VIRT=SWAP+RES
6.htop命令
需要安裝(第三方安裝包):
[root@localhost~]# yum install -y htop
(1)常用選項:
-d #:指定延遲時間間隔; -u UserName:僅顯示指定用戶的進程; -s COLUME:以指定字段進行排序;
(2)常用交互式命令:
l:顯示選定的進程打開的文件列表; s:跟蹤選定的進程的系統調用; t:以層級關係顯示各進程狀態; u: 僅顯示指定用戶的進程 k:發送信號,15通常用來殺死命令,15不起作用可用用9信號 #:快速定位到PID爲#的進程上
(3)顯示描述
左上方數據:表示每顆CPU、內存、交換內存的使用率
右上方數據:
Tasks:當前的任務數量,用戶空間進程
thr:線程數量
running:運行的數量
Load average :過去一分鐘、五分鐘、十五分鐘的平均負載
(4)支持鼠標操作的文本窗口
h命令獲取幫助
(5)獲取支持排序字段
[root@young ~]# htop --sort-key=help PID Command STATE PPID PGRP SESSION TTY_NR TPGID FLAGS