Linux下的進(jìn)程管理
在操作系統(tǒng)系統(tǒng)中,進(jìn)程是一個(gè)非常重要的概念。
一、Linux中進(jìn)程的相關(guān)知識(shí)
1、什么是進(jìn)程呢?
通俗的來(lái)說(shuō)進(jìn)程是運(yùn)行起來(lái)的程序。唯一標(biāo)示進(jìn)程的是進(jìn)程描述符(PID),在linux內(nèi)核中是通過task_struck和task_list來(lái)定義和管理進(jìn)程的。
2、進(jìn)程的分類
1)根據(jù)在linux不同模式下運(yùn)行分為:
核心態(tài):這類進(jìn)程運(yùn)行在內(nèi)核模式下,執(zhí)行一些內(nèi)核指令(Ring 0)。
用戶態(tài):這類進(jìn)程工作在用戶模式下,執(zhí)行用戶指令(Ring 3)。
如果用戶態(tài)的進(jìn)程要執(zhí)行一些核心態(tài)的指令,此時(shí)就會(huì)產(chǎn)生系統(tǒng)調(diào)用,系統(tǒng)調(diào)用會(huì)請(qǐng)求內(nèi)核指令完成相關(guān)的請(qǐng)求,就執(zhí)行的結(jié)果返回給用戶態(tài)進(jìn)程。
2)按照進(jìn)程的狀態(tài)可分為:
運(yùn)行態(tài):running 正在運(yùn)行的進(jìn)程
可中斷睡眠態(tài):進(jìn)程處于睡眠狀態(tài),但是可以被中斷
不可中斷的睡眠態(tài):進(jìn)程處于睡眠狀態(tài),但是不可以被中斷
停止態(tài):stoped 不會(huì)被內(nèi)核調(diào)度
僵死態(tài):zombie產(chǎn)生的原因是進(jìn)程結(jié)束后,它的父進(jìn)程沒有wait它,所導(dǎo)致的。
3)按照操作的密集程度
CPU密集型:進(jìn)程在運(yùn)行時(shí),占用CPU時(shí)間較多的進(jìn)程。
I/O密集型:進(jìn)程在運(yùn)行時(shí),占用I/O時(shí)間較多的進(jìn)程。
通常情況下,I/O密集型的優(yōu)先級(jí)要高于CPU密集型。
4)按照進(jìn)程的處理方式
批處理進(jìn)程:
交互式進(jìn)程:
實(shí)時(shí)進(jìn)程:
3、進(jìn)程的優(yōu)先級(jí)
進(jìn)程的有優(yōu)先級(jí),是用0-139數(shù)字來(lái)表示的,數(shù)字優(yōu)先級(jí)從小到大依次是:0-99,139-100。
優(yōu)先級(jí)分為2類:
實(shí)時(shí)優(yōu)先級(jí):0-99,是由內(nèi)核維護(hù)的
靜態(tài)優(yōu)先級(jí):100-139,可以使用nice來(lái)調(diào)整,nice值的取值范圍是[-20,19),分別對(duì)應(yīng)100到139。nice默認(rèn)值是0。
動(dòng)態(tài)優(yōu)先級(jí):由內(nèi)核動(dòng)態(tài)維護(hù),動(dòng)態(tài)調(diào)整。
二、進(jìn)程的管理工具
1、pstree命令 查看進(jìn)程數(shù)。 常用用法如下:
#p#
2、ps 命令 查看進(jìn)程的相關(guān)狀態(tài)。支持SysV和BSD兩種風(fēng)格的選項(xiàng)。
常用選型:
a 與終端相關(guān)的進(jìn)程
x 與終端無(wú)關(guān)的進(jìn)程
u 顯示運(yùn)行進(jìn)程的用戶
常用組合選項(xiàng):ps aux
- # 下面分別來(lái)說(shuō)明上圖的各個(gè)字段的含義
- # USER 進(jìn)程以什么用戶身份運(yùn)行
- # PID 進(jìn)程描述符 具有唯一性
- # %CPU 進(jìn)程運(yùn)行時(shí)所占的cpu百分比
- # %MEM 進(jìn)程運(yùn)行時(shí)內(nèi)存所占的百分比
- # VSZ Virtual memory SiZe 虛擬內(nèi)存使用大小
- # RSS 常駐內(nèi)存集,所有不能被置換出去的內(nèi)存集
- # STAT 表示內(nèi)存狀態(tài)
- # 常用的狀態(tài)有:
- # S:可中段睡眠狀態(tài)
- # R:運(yùn)行態(tài)
- # D:不可中斷睡眠態(tài)
- # T:停止態(tài)
- # Z:僵尸態(tài)
- # s:session leader 所謂進(jìn)程的領(lǐng)導(dǎo)者
- # +:表示是前臺(tái)進(jìn)程
- # l:多線程進(jìn)程
- # N:低優(yōu)先級(jí)進(jìn)程
- # <:高優(yōu)先級(jí)進(jìn)程
- # TTY 用來(lái)表示終端 顯示為“?”的說(shuō)明是與終端無(wú)關(guān)的進(jìn)程
- # START 進(jìn)程開始時(shí)間
- # TIME 進(jìn)程運(yùn)行時(shí)間
- # COMMAND 執(zhí)行進(jìn)程的命令 如果命令被 "[]"包圍,說(shuō)明是內(nèi)核線程
-e 顯示所有進(jìn)程
-f 顯示完成格式信息
常組合在一起使用:ps -ef
但是有些這種情況下,我們的命令有時(shí)候顯示不完整
此時(shí)想要顯示完成就要 ps -efww
-F:顯示額外信息
-H:顯示進(jìn)程的層次結(jié)構(gòu)
常用組合方式:ps -eFH
可能以后我們用到最多的選項(xiàng):
-o 我們可以自定義顯示字段
- # 常用的有:
- # pid command psr pri ni %cpu %mem rsz vsz等
#p#
3、pgrep,pidof
pgrep 常用選型:
-U 查看指定用戶的進(jìn)程號(hào)
-G 查看指定用戶組的進(jìn)程號(hào)
-l 顯示進(jìn)程名和進(jìn)程號(hào)
pidof:只顯示已啟動(dòng)進(jìn)程的PID
4、top命令
- [root@server ~]# pidof httpd # 沒啟動(dòng)的進(jìn)程不顯示
- [root@server ~]# pidof man
- 5283
實(shí)時(shí)監(jiān)控系統(tǒng)資源
- # 執(zhí)行top命令后,進(jìn)入交互式模式
- # top中的一些交互式命令:
- # l:控制是否顯示第一行,負(fù)載均衡信息
- # t:控制是否顯示進(jìn)程信息由和cpu信息
- # m:控制是否顯示內(nèi)存,交換信息
- # I 或者 1(數(shù)字):是否分別顯示cpu每個(gè)信息
- # M: 按%mem排序顯示,從大到小
- # k: kill 殺掉進(jìn)程
- # s:修改默認(rèn)刷新時(shí)間 默認(rèn)是3秒
- # 下面解釋抬頭信息:
- top - 21:35:17 up 10:03, 4 users, load average: 0.00, 0.00, 0.00
- # 系統(tǒng)時(shí)間 啟動(dòng)時(shí)間 登錄用戶數(shù) 負(fù)載均衡:1min 5min 15min
- # 何為系統(tǒng)負(fù)載?在這里指的是等待在進(jìn)程隊(duì)列里的平均進(jìn)程數(shù)
- # 此出顯示的信息 等價(jià)于 uptime 命令
- Tasks: 165 total, 1 running, 164 sleeping, 0 stopped, 0 zombie
- # 進(jìn)程總數(shù) 運(yùn)行數(shù) 睡眠態(tài)數(shù) 停止態(tài)數(shù) 僵尸進(jìn)程數(shù)
- 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
- # 0.0%us:user space:用于運(yùn)行用戶空間的程序所占的cpu百分比
- # 0.0%sy:system space:用于運(yùn)行內(nèi)核空間的程序所占的cpu百分比
- # 0.0%ni:nice值調(diào)用時(shí)間所占cpu百分百比
- # 100.0%id:系統(tǒng)cpu空閑所占百分比
- # 0.0%wa:用于等待I/O所占的cpu百分比
- # 0.0%hi:硬中斷所占cpu百分比
- # 0.0%si:軟中斷所占cpu百分比
- # 0.0%st:系統(tǒng)被“偷走”的cpu所占的百分比,一般指的是用于虛擬機(jī)運(yùn)行所占的cpu
- Mem: 1012548k total, 396328k used, 616220k free, 99444k buffers
- # 總內(nèi)存大小 使用的內(nèi)存大小 剩余內(nèi)存大小 緩存的大小
- Swap: 2097144k total, 0k used, 2097144k free, 144156k cached
- # 交換分區(qū)總大小 使用的 剩余的 緩沖大小
- # 此處顯示的信息等價(jià)于 free 命令
常用選項(xiàng):
-d #: 指定刷新時(shí)間間隔
-b: 以批次的方式顯示top的刷新
-n #: 顯示的批次
例如:top -d 4 -b 2 -n 3
#p#
4、htop
htop命令是top命令的升級(jí)版,無(wú)論是在功能上還是在界面顯示上,都比top命令更勝一籌。
u: 交互式選擇顯示指定用戶的進(jìn)程
l: 顯示光標(biāo)所在進(jìn)程所打開的文件列表
s: 顯示光標(biāo)所在進(jìn)程執(zhí)行的系統(tǒng)調(diào)用
a: 綁定進(jìn)程到指定的CPU
#:快速定位光標(biāo)至PID為#的進(jìn)程上
下圖是htop的界面。這個(gè)工具比較強(qiáng)大,用法功能比較多,在這里先做簡(jiǎn)單介紹。以后筆者會(huì)專門寫htop的博客。
5、vmstat
wmstat 查看虛擬使用情況
- # 常用用法:
- # vmstat 顯示信息會(huì)默認(rèn)1秒刷新一次,一直顯示
- # vmstart -n 2 顯示信息會(huì)2秒刷新一次,一直顯示
- # vmstat -n 1 4 顯示信息會(huì)1秒刷新一次,刷新4次
- [root@server ~]# vmstat -n 1 1
- procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
- r b swpd free buff cache si so bi bo in cs us sy id wa st
- 0 0 0 614392 100468 144776 0 0 2 1 6 5 0 0 100 0 0
- # 我們解釋一下每個(gè)字段的含義:
- # procs字段 關(guān)于進(jìn)程的
- # r 指運(yùn)行隊(duì)列的進(jìn)程數(shù),如果過長(zhǎng),可能是cpu性能較低
- # b 阻塞隊(duì)列的長(zhǎng)度,通常是用于等待I/O的完成。如果太大,說(shuō)明I/O性能較低
- # memory字段 關(guān)于內(nèi)存使用的
- # swap 使用的交換內(nèi)存大小
- # free 空余內(nèi)存大小 它的值=總大小-buff-cache-used
- # buff 緩沖大小,目的是為了加速I/O的寫操作(一般是磁盤)
- # cache 緩存大小,摸底是為了加速I/O的讀操作(一般是磁盤)
- # swap字段 說(shuō)明交換內(nèi)存
- # si swapin 指的是數(shù)據(jù)進(jìn)入交換內(nèi)存的速率 單位:KB/s
- # so swapout 指的是數(shù)據(jù)出交換內(nèi)存的速率 單位:KB/s
- # 如果這2個(gè)值比較大的時(shí)候,會(huì)出現(xiàn)抖動(dòng)現(xiàn)象。建議增加內(nèi)存
- # io字段 I/O的說(shuō)明
- # bi:Block in 從塊設(shè)備讀入內(nèi)存的速率 KB/s
- # bo: block out 保存到塊設(shè)備的速率 KB/s
- # 這就是我們通常說(shuō)的磁盤的讀寫性能,可以通過RAID提高。
- # system字段 關(guān)于系統(tǒng)的
- # in: interruppt 中斷發(fā)生的速率
- # cs: 上下文切換的速率(進(jìn)程調(diào)度)
- # cpu字段 說(shuō)明cpu的使用情況
- # us:user space:用于運(yùn)行用戶空間的程序所占的cpu百分比
- # sy:system space:用于運(yùn)行內(nèi)核空間的程序所占的cpu百分比
- # id:系統(tǒng)cpu空閑所占百分比
- # wa:用于等待I/O所占的cpu百分比,這是由于cpu和i/o速度相差太多所造成的
- # st:系統(tǒng)被“偷走”的cpu所占的百分比,一般指的是用于虛擬機(jī)運(yùn)行所占的cpu的時(shí)間百分比
6、nice,renice
調(diào)整進(jìn)程的優(yōu)先級(jí)。
nice 在進(jìn)程啟動(dòng)的時(shí)候設(shè)置優(yōu)先級(jí)。
- # 常用參數(shù):
- # -n NICE 例如:nice -n 3 httpd
- # 一般情況下,nice值是負(fù)值的設(shè)定一般有管理員來(lái)設(shè)定。普通用戶只能設(shè)置nice為正值。
- # 如果不指定 -n 參數(shù),默認(rèn)的nice值是10
renice 重新設(shè)置已啟動(dòng)進(jìn)程的優(yōu)先級(jí)。
- # 常用選項(xiàng)是:
- # -n NICE 重新設(shè)定nice的值
- # -p PID 設(shè)定進(jìn)程的PID
7、kill,killall
對(duì)于有Linux C編程經(jīng)驗(yàn)的人來(lái)說(shuō),我們知道IPC通信方式之一就是通過信號(hào)量(signal),那么對(duì)于kill和killall命令來(lái)說(shuō),它們與信號(hào)量有著很大的關(guān)系,或者說(shuō)kill,killall命令通過信號(hào)量讓我們可以手動(dòng)的向進(jìn)程傳遞信號(hào)來(lái)控制進(jìn)程。
常見的信號(hào)量如下:
- [root@server ~]# 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
- # 我們常用到的信號(hào)是:
- # 1 SIGHUP 在不關(guān)閉進(jìn)程的情況下,重讀配置文件。ngnix在這方面做得相當(dāng)?shù)暮茫踔量梢詫?shí)現(xiàn)在線升級(jí)。
- # 2 SIGINT 中斷信號(hào) 相當(dāng)于 ctrl + C
- # 9 SIGKILL 暴力殺死
- # 15 SIFTERM 優(yōu)雅的關(guān)閉 默認(rèn)是這種情況
- # kill用法如下:
- # kill [-SIGNAL] PID
- # 對(duì)于SIGNAL有三種表示:例如:1) -9 -15 -1 -2 2)-SIGKILL -SIGHUP -SIGTERM 3) -HUP -KILL -TERM -INT 等。
- #
- # killall是殺掉一類進(jìn)程
- # 例如:killall httpd 等價(jià)于 kill `pidof httpd`
#p#
8、jobs,bg,fg
什么是作業(yè)呢?作業(yè)就是許多進(jìn)程一起協(xié)同完成一項(xiàng)具體的工作。作業(yè)有前臺(tái)作業(yè)和后臺(tái)作業(yè)2種。
使用 & 或者 ctrl + Z可以把一個(gè)進(jìn)程打入后臺(tái)。
- # ping 192.168.0.1 &
- # 這樣打入后臺(tái)的運(yùn)行的作業(yè),退出終端的時(shí)候,作業(yè)就會(huì)終止。
- # 使用 nohup 命令可避免這個(gè)問題
- # nohup ping 192.168.0.1 &
- # 可以使用jobs命令查看后臺(tái)的作業(yè)
- # 每個(gè)作業(yè)都有一個(gè)作業(yè)號(hào)來(lái)標(biāo)識(shí)作業(yè)
- # 作業(yè)控制命令
- # bg [[%]JOB_NUM]: 讓送往后臺(tái)的作業(yè)繼續(xù)在后臺(tái)運(yùn)行
- # fg [[%]JOB_NUM]: 將后臺(tái)作業(yè)調(diào)回前臺(tái)
- # kill %JOB_NUM: 終止指定的作業(yè)
9、dstat命令,查看各種狀態(tài)信息
用法:dstat [-afv] [options..] [delay [count]]
常用參數(shù) | 具體意義 |
-c | 顯示cpu統(tǒng)計(jì)數(shù)據(jù),如有多個(gè)CPU匯總統(tǒng)計(jì) |
-d | 顯示disk統(tǒng)計(jì)數(shù)據(jù),如有多塊磁盤則匯總統(tǒng)計(jì) |
-D DEVICE | 顯示特定磁盤的信息 |
-g | 顯示page信息(具體什么是page以及他的作用,會(huì)在以后內(nèi)存調(diào)優(yōu)博客中具體說(shuō)明) |
-i | 顯示中斷的統(tǒng)計(jì)數(shù)據(jù) |
-m | 顯示內(nèi)存的統(tǒng)計(jì)信息 |
-l | 顯示系統(tǒng)的負(fù)載信息 |
-n | 顯示網(wǎng)絡(luò)接口的相關(guān)屬性 |
-s | 顯示系統(tǒng)屬性 |
-N INTER_FACE_NAME | 顯示特定接口的屬性 |
-s | 顯示交換內(nèi)存的屬性 |
-p | 顯示進(jìn)程隊(duì)列 |
--ipc | 顯示ipc消息隊(duì)列、信號(hào)量和共享內(nèi)存的使用狀況 |
-a | 等價(jià)于 -cdngy 顯示CPU,磁盤,網(wǎng)卡,page,系統(tǒng)屬性 |
-f | 以完整格式顯示所有信息, |
--tcp,--udp | 顯示tcp,udp狀態(tài)信息 |
更多參數(shù)查看 man 手冊(cè)。
示例:
10、查看內(nèi)存映射
pmap PID 查看對(duì)應(yīng)進(jìn)程的內(nèi)存映射,常用的用法是:pman `pidof PROCESS_NAME`。當(dāng)然這些信息也可以查看 /proc/PID/pmap 文件查看。
11、glances命令
一款強(qiáng)大的系統(tǒng)監(jiān)控工具:能實(shí)時(shí)監(jiān)控像cpu,meomory,load,swap,Network,mount,disk等信息。
其他功能的使用,請(qǐng)使用 h 來(lái)獲取幫助。由于此工具比較強(qiáng)大,因此這里者簡(jiǎn)單的介紹,后期會(huì)于 htop 工具做專門的介紹。
原文鏈接:http://guoting.blog.51cto.com/8886857/1440640