管理進程狀態(tài)
當程序運行為進程后,如果希望停止進程栋齿,怎么辦呢? 那么此時我們可以使用linux的kill命令對進程發(fā)送關閉信號苗胀。當然除了kill、還有killall瓦堵,pkill基协。
1.使用kill -l列出當前系統(tǒng)所支持的信號
root@Hyman[15:48:44]~# 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
雖然linux支持信號很多,但是我們僅列出我們最為常用的3個信號
數(shù)字編號 | 信號含義 | 信號翻譯 |
---|---|---|
1 | SIGHUP | 通常用來重新加載配置文件 |
9 | SIGKILL | 強制殺死進程 |
15 | SIGTERM | 終止進程菇用,默認kill使用該信號 |
2.我們使用kill命令殺死指定PID的進程澜驮。
- 給 vsftpd 進程發(fā)送信號 1,15(沒有這個服務需要提前安裝)
root@Hyman[15:50:52]~# yum install vsftpd -y
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.huaweicloud.com
* extras: mirrors.tuna.tsinghua.edu.cn
* updates: mirrors.cqu.edu.cn
Package vsftpd-3.0.2-25.el7.x86_64 already installed and latest version
Nothing to do
root@Hyman[15:50:55]~# systemctl start vsftpd
root@Hyman[16:10:12]~# ps aux | grep vsftpd
root 8065 0.0 0.0 53176 580 ? Ss 16:10 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root 8067 0.0 0.0 112708 976 pts/0 R+ 16:10 0:00 grep --color=auto vsftpd
- 發(fā)送重載信號,例如 vsftpd 的配置文件發(fā)生改變惋鸥,希望重新加載
root@Hyman[16:10:12]~# ps aux | grep vsftpd
root 8065 0.0 0.0 53176 580 ? Ss 16:10 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root 8067 0.0 0.0 112708 976 pts/0 R+ 16:10 0:00 grep --color=auto vsftpd
root@Hyman[16:10:26]~# kill -1 8065
root@Hyman[16:11:39]~# ps aux | grep vsftpd
root 8065 0.0 0.0 53176 760 ? Ss 16:10 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root 8070 0.0 0.0 112708 976 pts/0 R+ 16:11 0:00 grep --color=auto vsftpd
- 發(fā)送停止信號杂穷,當然vsftpd 服務有停止的腳本 systemctl stop vsftpd
root@Hyman[16:12:21]~# ps aux | grep vsftpd
root 8065 0.0 0.0 53176 760 ? Ss 16:10 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root 8078 0.0 0.0 112708 972 pts/0 R+ 16:12 0:00 grep --color=auto vsftpd
root@Hyman[16:12:25]~# kill 8065
root@Hyman[16:12:35]~# ps aux | grep vsftpd
root 8080 0.0 0.0 112708 976 pts/0 R+ 16:12 0:00 grep --color=auto vsftpd
- 發(fā)送強制停止信號悍缠,當無法停止服務時,可強制終止信號
root@Hyman[16:12:35]~# ps aux | grep vsftpd
root 8080 0.0 0.0 112708 976 pts/0 R+ 16:12 0:00 grep --color=auto vsftpd
root@Hyman[16:12:37]~# systemctl start vsftpd
root@Hyman[16:13:44]~# ps aux | grep vsftpd
root 8088 0.0 0.0 53176 576 ? Ss 16:13 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root 8090 0.0 0.0 112708 976 pts/0 R+ 16:13 0:00 grep --color=auto vsftpd
root@Hyman[16:13:46]~# kill -9 8088
root@Hyman[16:13:58]~# ps aux | grep vsftpd
root 8092 0.0 0.0 112708 976 pts/0 R+ 16:13 0:00 grep --color=auto vsftpd
Linux系統(tǒng)中的killall耐量、pkill命令用于殺死指定名字的進程飞蚓。我們可以使用kill命令殺死指定進程PID的進程,如果要找到我們需要殺死的進程廊蜒,我們還需要在之前使用ps等命令再配合grep來查找進程趴拧,而killall、pkill把這兩個過程合二為一山叮,是一個很好用的命令著榴。
- 例1:通過服務名稱殺掉進程
root@Hyman[16:14:00]~# systemctl start vsftpd
root@Hyman[16:15:57]~# pkill vsftpd
root@Hyman[16:16:05]~# ps aux | grep vsftpd
root 8104 0.0 0.0 112708 976 pts/0 R+ 16:16 0:00 grep --color=auto vsftpd
root@Hyman[16:16:47]~# pkill vsftpd
root@Hyman[16:17:08]~# ps aux | grep vsftpd
root 8104 0.0 0.0 112708 976 pts/0 R+ 16:16 0:00 grep --color=auto vsftpd
- 例2:使用pkill踢出從遠程登錄到本機的用戶,終止pts/0上所有進程, 并且bash也結束(用戶被強制退出)
root@Hyman[16:17:19]~# w
16:18:44 up 5:51, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 10:28 4.00s 0.17s 0.02s w
root pts/1 10.0.0.1 16:16 1:46 0.01s 0.01s -bash
root@Hyman[16:18:44]~# pkill -9 -t pts/1
root@Hyman[16:18:59]~# w
16:19:01 up 5:51, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 10:28 5.00s 0.16s 0.00s w
管理后臺進程
1.什么是后臺進程
通常進程都會在終端前臺運行聘芜,一旦關閉終端兄渺,進程也會隨著結束,那么此時我們就希望進程能在后臺運行汰现,就是將在前臺運行的進程放入后臺運行挂谍,這樣及時我們關閉了終端也不影響進程的正常運行。
2.我們?yōu)槭裁匆獙⑦M程放入后臺運行
比如:我們此前在國內服務器往國外服務器傳輸大文件時瞎饲,由于網(wǎng)絡的問題需要傳輸很久口叙,如果在傳輸?shù)倪^程中出現(xiàn)網(wǎng)絡抖動或者不小心關閉了終端則會導致傳輸失敗,如果能將傳輸?shù)倪M程放入后臺嗅战,是不是就能解決此類問題了妄田。
3.使用什么工具將進程放入后臺
早期的時候大家都選擇使用&符號將進程放入后臺,然后在使用jobs驮捍、bg疟呐、fg等方式查看進程狀態(tài),但太麻煩了东且。也不直觀启具,所以我們推薦使用screen。
jobs珊泳、bg鲁冯、fg的使用(強烈不推薦,了解即可)
[root@xuliangwei ~]# sleep 3000 & //運行程序(時)色查,讓其在后臺執(zhí)行
[root@xuliangwei ~]# sleep 4000 //^Z,將前臺的程序掛起(暫停)到后臺
[2]+ Stopped sleep 4000
[root@xuliangwei ~]# ps aux |grep sleep
[root@xuliangwei ~]# jobs //查看后臺作業(yè)
[1]- Running sleep 3000 &
[2]+ Stopped sleep 4000
[root@xuliangwei ~]# bg %2 //讓作業(yè) 2 在后臺運行
[root@xuliangwei ~]# fg %1 //將作業(yè) 1 調回到前臺
[root@xuliangwei ~]# kill %1 //kill 1薯演,終止 PID 為 1 的進程
[root@xuliangwei ~]# (while :; do date; sleep 2; done) & //進程在后臺運行,但輸出依然在當前終端
[root@xuliangwei ~]# (while :; do date; sleep 2; done) &>/dev/null &
screen的使用(強烈推薦秧了,生產(chǎn)必用)
- 安裝
root@Hyman[16:19:01]~# yum install screen -y
- 開啟一個screen窗口,指定名稱
root@Hyman[16:25:57]~# screen -S hyman1
- 在screen窗口中執(zhí)行任務即可(讓它后臺下載CentOS 7的鏡像跨扮。)
root@Hyman[16:28:43]~# wget https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso
--2019-08-22 16:44:44-- https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso
Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 111.6.180.116, 111.6.180.118, 111.62.69.177, ...
Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|111.6.180.116|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4588568576 (4.3G) [application/octet-stream]
Saving to: ‘CentOS-7-x86_64-DVD-1810.iso’
4% [=> ] 229,203,364 2.05MB/s eta 11m 56s
- 平滑的退出screen:ctrl+a+d 但不會終止screen中的任務。注意: 如果使用exit才算真的關閉screen窗口(或使用Ctrl+C).
ctrl+a+d
- 查看當前正在運行的screen有哪些
root@Hyman[16:49:06]~# screen -list
There is a screen on:
8186.hyman1 (Detached)
1 Socket in /var/run/screen/S-root.
- 進入正在運行的screen
root@Hyman[16:49:08]~# screen -r hyman1
root@Hyman[16:49:08]~# screen -r 8186
進程的優(yōu)先級[進階]
1.什么優(yōu)先級
優(yōu)先級指的是優(yōu)先享受資源,比如排隊買票時好港,軍人優(yōu)先愉镰、老人優(yōu)先米罚。等等
2.為什么要有系統(tǒng)優(yōu)先級
舉個例子: 海底撈火鍋正常情況下響應就特別快钧汹,那么當節(jié)假日來臨時人員突增則會導致處理請求特別慢,那么假設我是海底撈VIP客戶(最高優(yōu)先級)录择,無論門店多么繁忙拔莱,我都不用排隊,海底撈人員會直接服務于我隘竭,滿足我的需求塘秦。至于沒有VIP的人員(較低優(yōu)先級)則進入排隊等待狀態(tài)。(PS: 至于等多久动看,那.....)
3.系統(tǒng)中如何給進程配置優(yōu)先級?
在啟動進程時尊剔,為不同的進程使用不同的調度策略。nice 值越高: 表示優(yōu)先級越低菱皆,例如+19须误,該進程容易將CPU 使用量讓給其他進程。nice 值越低: 表示優(yōu)先級越高仇轻,例如-20京痢,該進程更不傾向于讓出CPU。
1) 使用top或ps命令查看進程的優(yōu)先級
- 使用top可以查看nice優(yōu)先級篷店。 NI: 實際nice級別祭椰,默認是0。 PR: 顯示nice值疲陕,-20映射到0方淤,+19映射到39
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7497 root 20 0 158760 2028 680 S 0.3 0.2 0:00.85 sshd
1 root 20 0 128188 2464 732 S 0.0 0.2 0:02.10 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.70 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
- 使用ps查看進程優(yōu)先級
root@Hyman[16:59:26]~# ps axo command,nice | grep sshd | grep -v grep
/usr/sbin/sshd -D 0
sshd: root@pts/0 0
nice指定程序的優(yōu)先級。語法格式 nice -n 優(yōu)先級數(shù)字進程名稱
- 開啟vim并且指定程序優(yōu)先級為-5
root@Hyman[16:59:26]~# nice -n -5 vim &
[1] 98417
- 查看該進程的優(yōu)先級情況
root@Hyman[16:59:26]~# ps axo pid,command,nice |grep 98417
98417 vim -5
renice命令修改一個正在運行的進程優(yōu)先級蹄殃。語法格式 renice -n 優(yōu)先級數(shù)字 進程pid
- 1.查看sshd進程當前的優(yōu)先級狀態(tài)
root@Hyman[16:59:26]~# ps axo pid,command,nice |grep
70840 sshd: root@pts/2 0
98002 /usr/sbin/sshd -D 0
- 2.調整sshd主進程的優(yōu)先級
root@Hyman[16:59:26]~# renice -n -20 98002
98002 (process ID) old priority 0, new priority -20
- 3.調整之后記得退出終端
root@Hyman[16:59:26]~# ps axo pid,command,nice |grep
70840 sshd: root@pts/2 0
98002 /usr/sbin/sshd -D -20
root@Hyman[16:59:26]~# exit
- 4.當再次登陸sshd服務携茂,會由主進程fork子進程(那么子進程會繼承主進程的優(yōu)先級)
root@Hyman[16:59:26]~# ps axo pid,command,nice |grep
98002 /usr/sbin/sshd -D -20
98122 sshd: root@pts/0 -20
生產(chǎn)案例、Linux出現(xiàn)假死窃爷,怎么回事邑蒋?
1.什么是假死
所謂假死,就是能ping通按厘,但是ssh不上去医吊;任何其他操作也都沒反應,包括上面部署的nginx也打不開頁面逮京。
2.假死其實很難出現(xiàn)一次
作為一個多任務操作系統(tǒng)卿堂,要把系統(tǒng)忙死,忙到ssh都連不上去,也不是那么容易的草描。尤其是現(xiàn)在還有fd保護览绿、進程數(shù)保護、最大內存保護之類的機制穗慕。你可以fork很多進程饿敲,系統(tǒng)會變得很慢,但是ssh還是能連上去逛绵;你可以分配很多內存怀各,但是內存多到一定程度oom killer就會把你的進程殺掉,于是ssh又能工作了术浪。
3.假死是如何實現(xiàn)的
有一個確定可以把系統(tǒng)搞成假死的辦法是:主進程分配固定內存瓢对,然后不停的fork,并且在子進程里面sleep(100)胰苏。也就是說硕蛹,當主進程不停fork的時候,很快會把系統(tǒng)的物理內存用完硕并,當物理內存不足時候法焰,系統(tǒng)會開始使用swap;那么當swap不足時會觸發(fā)oom killer進程鲤孵;當oom killer殺掉了子進程壶栋,主進程會立刻fork新的子進程,并再次導致內存用完普监,再次觸發(fā)oom killer進程贵试,于是進入死循環(huán)。而且oom killer是系統(tǒng)底層優(yōu)先級很高的內核線程凯正,也在參與死循環(huán)毙玻。
4.系統(tǒng)假死為何能ping同無法連接
此時機器可以ping通,但是無法ssh上去廊散。這是由于ping是在系統(tǒng)底層處理的桑滩,沒有參與進程調度;sshd要參與進程調度允睹,但是優(yōu)先級沒oom killer高运准,總得不到調度。
5.出現(xiàn)假死怎么辦?
為什么要費那么大的力氣把機器搞死缭受?我們知道假死是怎么產(chǎn)生的即可胁澳,這樣可以針對假死的原因進行預防。 (其實假死的情況很少發(fā)生米者,只有當代碼寫的bug很多的情況下會出現(xiàn)韭畸。)其實建議使用nice將sshd的進程優(yōu)先級調高宇智。這樣當系統(tǒng)內存吃緊,還能勉強登陸sshd胰丁,進入調試随橘。然后分析故障。
系統(tǒng)平均負載[進階]
每次發(fā)現(xiàn)系統(tǒng)變慢時锦庸,我們通常做的第一件事机蔗,就是執(zhí)行 top 或者 uptime 命令,來了解系統(tǒng)的負載情況酸员。比如像下面這樣蜒车,我在命令行里輸入了 uptime 命令讳嘱,系統(tǒng)也隨即給出了結果幔嗦。
root@Hyman[16:59:26]~# uptime
04:49:26 up 2 days, 2:33, 2 users, load average: 0.70, 0.04, 0.05
我們已經(jīng)比較熟悉前面幾列,它們分別是當前時間沥潭、系統(tǒng)運行時間以及正在登錄用戶數(shù)邀泉。
而最后三個數(shù)字呢,依次則是過去 1 分鐘钝鸽、5 分鐘汇恤、15 分鐘的平均負載(Load Average)。
1.什么是平均負載
平均負載不就是單位時間內的 CPU 使用率嗎拔恰?上面的 0.70因谎,就代表 CPU 使用率是 70%。其實上并.....那到底如何理解平均負載:平均負載是指單位時間內颜懊,系統(tǒng)處于可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù)财岔,也就是平均活躍進程數(shù),PS: 平均負載與 CPU 使用率并沒有直接關系河爹。
2.可運行狀態(tài)和不可中斷狀態(tài)是什么
1.可運行狀態(tài)進程匠璧,是指正在使用 CPU 或者正在等待 CPU 的進程,也就是我們ps 命令看到處于 R 狀態(tài)的進程咸这。2.不可中斷進程夷恍,(你做什么事情的時候是不能打斷的?) 系統(tǒng)中最常見的是等待硬件設備的 I/O 響應,也就是我們 ps 命令中看到的 D 狀態(tài)(也稱為 Disk Sleep)的進程媳维。例如: 當一個進程向磁盤讀寫數(shù)據(jù)時酿雪,為了保證數(shù)據(jù)的一致性,在得到磁盤回復前侄刽,它是不能被其他進程或者中斷打斷的指黎,這個時候的進程就處于不可中斷狀態(tài)。如果此時的進程被打斷了唠梨,就容易出現(xiàn)磁盤數(shù)據(jù)與進程數(shù)據(jù)不一致的問題袋励。所以,不可中斷狀態(tài)實際上是系統(tǒng)對進程和硬件設備的一種保護機制。
劃重點茬故,因此你可以簡單理解為盖灸,平均負載其實就是單位時間內的活躍進程數(shù)。