在使用linux的時候,進程管理是必須要掌握的技能,下面從幾個方面介紹下進程管理相關知識點。
進程分類
- 前臺進程:
該程序運行行,就占據了命令提示符;
- 后臺進程:
啟動之后,釋放命令提示符,后續的操作在后臺執行;
從前臺到后臺:
當使用Ctrl+z 后該進程會放到后臺,并停止運行;
如果想讓它在后臺繼續運行,則可以使用bg命令:
# bg job_id
這個job_id是使用jobs命令來查看的。每個放到后臺的進程都有一個作業號。
[root@ns2 ~]# jobs
[1] + suspended sleep 3600
[root@ns2 ~]#
作業號:
+:有+號的表示命令默認操作的作業;
-:有-號的表示命令將第二個執行的操作;
把后臺的進程拿到前臺來執行:
# fg job_id
終止某個作業:
# kill %job_id //注意這里的這個%一定不能省;
進程狀態
D:不可中斷的睡眠,通常是I/0操作;
R:運行或就緒,在運行隊列上;
S:可中斷的睡眠,(等待一個事件的結束)
T:停止
Z:僵死
<:高優先級進程
N:低優先級進程
+:前臺進程組中的進程(和終端相關的)
l:多線程進程
s:會話進程首進程
PS命令
ps - report a snapshot of the current processes 給當前進程生成一個快照;可以理解成process status
ps命令支持兩種不同風格的參數,BSD和UNIX;
- BSD風格:不加-
[root@ns2 ~]# ps aux|head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 10368 668 ? Ss 10:26 0:01 init [3]
root 2 0.0 0.0 0 0 ? S< 10:26 0:00 [migration/0]
root 3 0.0 0.0 0 0 ? SN 10:26 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S< 10:26 0:18 [events/0]
root 5 0.0 0.0 0 0 ? S< 10:26 0:00 [khelper]
root 10 0.0 0.0 0 0 ? S< 10:26 0:00 [kthread]
root 14 0.0 0.0 0 0 ? S< 10:26 0:00 [kblockd/0]
root 15 0.0 0.0 0 0 ? S< 10:26 0:00 [kacpid]
root 186 0.0 0.0 0 0 ? S< 10:26 0:00 [cqueue/0]
[root@ns2 ~]#
USER:表示運行此進程的用戶
PID:表示此進程的進程號
%CPU:表示此進程占用CPU的百分比
%MEM:表示此進程占用內存的百分比
VSZ:此進程占用的虛擬內存大小,單位KB
virtual memory size of the process in KiB (1024-byte units). Device mAppings are currently excluded; this is subject to change.
RSS:此進程占用常住內存大小,不包括swapped的大小,也就是物理內存的大小,單位KB
resident set size, the non-swapped physical memory that a task has used (in kiloBytes).
TTY:表示此進程所屬的終端,?表示不屬于任何終端;
STAT:該進程的狀態;
START:表示此進程的啟動時間,
TIME 占用CPU的累積時長;
accumulated cpu time, user + system. The display format is usually "MMM:SS", but can be shifted to the right if the process used more than 999 minutes of cpu time.
COMMAND:是哪個命令啟動的該進程,如果命令是被[]包起來的,則表示是內核進程;
- UNIX風格:必須加-
例如:ps -elf
-e Select all processes. Identical to -A 顯示所有的進程,和-A選項是一樣的,所以也可以寫在:ps -Alf
-l long format. The -y option is often useful with this. 使用長行格式顯示,
-f does full-format listing. This option can be combined with many other UNIX-style options to add additional columns.就是說使用比較全的格式來顯示,這樣可以顯示更多的信息;
[root@ns2 ~]# ps -elf|head
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 75 0 - 2592 - 10:26 ? 00:00:01 init [3]
1 S root 2 1 0 -40 - - 0 migrat 10:26 ? 00:00:00 [migration/0]
1 S root 3 1 0 94 19 - 0 ksofti 10:26 ? 00:00:00 [ksoftirqd/0]
1 S root 4 1 0 70 -5 - 0 worker 10:26 ? 00:00:19 [events/0]
1 S root 5 1 0 70 -5 - 0 worker 10:26 ? 00:00:00 [khelper]
5 S root 10 1 0 74 -5 - 0 worker 10:26 ? 00:00:00 [kthread]
1 S root 14 10 0 70 -5 - 0 worker 10:26 ? 00:00:00 [kblockd/0]
1 S root 15 10 0 80 -5 - 0 worker 10:26 ? 00:00:00 [kacpid]
1 S root 186 10 0 77 -5 - 0 worker 10:26 ? 00:00:00 [cqueue/0]
[root@ns2 ~]#
-U|u :顯示屬于指定的用戶名或用戶UID的進程。-u:表示的是有效的UID,比如:當Jack用戶正在執行passwd在修改自己的密碼,那么此時,用pgrep -u jack passwd并不能看到,因為passwd是有SUID的,此時該進程的執行者已經是root了。如果使用-U就可以顯示出jack;
-o 用戶可以定義要顯示的字段:ppid,pid,cmd,stat等
pgrep命令
pgrep patten
查找能夠匹配pattern的進程的進程號
pgrep -u|U root pattern
查找屬于root用戶的進程,并且能夠匹配pattern的進程的進程號. -u和-U的區別上ps的是一樣的;
[root@ns2 ~]# pgrep bash
5822
6126
6345
[root@ns2 ~]# pgrep -u root bash
5822
6126
[root@ns2 ~]#
pstree命令:
pstree 以樹狀結構來顯示進程信息;
top命令:
以動態的方式顯示系統中的進程的相關信息:
[root@ns2 ~]# top -n 1
top - 23:49:36 up 13:23, 3 users, load average: 0.00, 0.00, 0.00
Tasks: 99 total, 1 running, 98 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.4%id, 0.2%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 507528k total, 424776k used, 82752k free, 43412k buffers
Swap: 1052248k total, 0k used, 1052248k free, 198940k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 15 0 10368 668 564 S 0.0 0.1 0:01.10 init
2 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
%wa wait 等待I/0所占用CPU時間的百分比;
%hi Hard Interruption CPU的硬中斷;
%si Soft Interruption CPU的軟中斷;
%st 指的是被偷走的CPU的時間;
VIRT 表示虛擬內存swap的使用量,單位是KB;
RES 表示的是物理內存的使用量,單位是KB;
SHR 表示的是占用共享內存的大小,單位是KB。因為LINUX系統中有一個庫是共享的,所以在內存中也是以共享內存的方式提供的,這樣就避免了每個進程都要單獨分一點內存來使用相同的庫。
TIME+ 真正占用CPU的時間;
top中的交互命令:
1(數字):如果服務器有多個CPU,那當按1后,就會顯示每個CPU的負載情況;
M:按物理內存的占用來排序;
P:按CPU占用來排序;
T:按占用CPU的時間來排序;
l (小寫L):是否顯示平均負載和啟動時間那一行;
t:是否顯示Tasks和CPU(s)狀態那一行信息;
m:是否顯示內存和SWAP使用情況的那兩行;
c:是否顯示完整的命令信息;
q:退出top
k:終止指定的進程,按下k后,會讓用戶輸入一個進程的pid
> 表示向后翻頁;
< 向前翻頁;
-d number 表示讓top刷新的時間;
-b 讓top以一批一批地來顯示;也就是一次顯示全部進程的相關信息;
-n number 當top工作在批模式下時,-n表示讓top顯示多少批;
進程間通信的方式
1、共享內存:一個進程在這塊共享內存中寫入數據,另一個進程再去讀這個數據;
2、使用信號;
3、使用semaphore
Linux中的信號種類:
查看當前系統中支持的信息有哪些,可以使用kill -l命令:
[root@ns2 ~]# 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
[root@ns2 ~]#
其中幾個最重要的是:
1:SIGHUP 讓一個里程不用重啟,就可以重新讀取其配置文件,并讓新的配置文件生效;
2:SIGINT 中斷一個進程,和Ctrl+c的作用一樣;
9:SIGKILL 殺死一個進程,直接關閉,不論是不是有打開的文件或是提供的服務;
15:SIGTERM 終止一個進程,如果該進程有打開的文件或是正在提供服務等,會等它這些操作都完成后,再關閉;(kill 的默認信號)
指定一個信號 :
- 使用信號號碼:kill -1|2|9|15
- 使用信號名稱:kill -SIGKILL
- 使用信號簡寫:kill -KILL
kill的用法:
# kill -9 pid
還有一個命令是killall,也可以和kill一樣接受信號,只是killall后面接的是進程名稱;
# killall [-9] httpd
調整進程的NICE值:
進程的nice命令代表的是進程的優先級:范圍是-20~19,數字越小,優先級越高;
- 對于已經在運行的進程,那么可以使用renice命令
# renice 18 33098 //后面接的是進程的PID
- 對于還沒有運行的程序,可以在其運行的時候使用nice來指定
# nice -n 10 tar zcf test.tgz /tmp
vmstat命令
vmstat 查看系統狀態信息:
[root@ns2 ~]# vmstat 1 5
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 96616 53252 190240 0 0 63 9 1023 48 0 1 98 1 0
0 0 0 96616 53252 190240 0 0 0 0 1020 47 0 0 100 0 0
0 0 0 96616 53252 190264 0 0 0 0 994 28 0 0 100 0 0
0 0 0 96616 53252 190264 0 0 0 0 1010 48 0 2 98 0 0
0 0 0 96616 53252 190264 0 0 0 0 989 28 0 0 100 0 0
[root@ns2 ~]#
- procs:表示進程相關信息:
r:表示正在運行的進程隊列長度;running
b:表示進程阻塞的隊列長度; blocked
memory:表示和內存相關的信息:
swpd:表示內存中有多少個頁面被交換到了交換分區;
free:空閑的內存頁面數量;
buff:緩沖使用的頁面數量;
cache:緩存使用的頁面數量;
swap:顯示和交換分區相關的信息:
si:有多個個內存頁面被交換到了交換分區;
so:有多個交換分區的頁面被交換到了內存;
io:和硬盤I/O相關:
bi:有多少個硬盤塊被放到內存中;block in 這些方向都是相對于內存來說的
bo:有多少個硬盤塊從內存同步到了硬盤中;block out
- system和系統相關:
in:表示有多少個中斷;Interruption
cs:表示有多少次的上下文切換;也就是進程的輪換的到CPU上去執行一段時間; context switch
- CPU 和CPU相關的信息:
us:用戶空間占用的百分比;
sy:內核空間占用的百分比;
id:系統空間百分比;
wa:等待I/O占用的百分比;
st:CPU被偷走的時間;