day21-進程管理2

1.管理進程狀態(tài)

當(dāng)程序運行為進程后,如果希望停止進程,怎么辦呢? 那么此時我們可以使用linux的kill命令對進程發(fā)送關(guān)閉信號。當(dāng)然除了kill、還有killall,pkill

  • 1.使用kill -l列出當(dāng)前系統(tǒng)所支持的信號



    雖然linux支持信號很多,但是我們僅列出我們最為常用的3個信號

數(shù)字編號 信號含義 信號翻譯
1 SIGHUP 通常用來重新加載配置文件
9 SIGKILL 強制殺死進程
15 SIGTERM 終止進程,默認kill使用該信號

1.我們使用kill、pkill命令殺死指定PID的進程。

[root@localhost ~]# ps aux | grep nginx
root       6885  0.0  0.2  46440   980 ?        Ss   08:31   0:00 nginx: master process nginx
nginx      6887  0.0  0.4  46852  2176 ?        S    08:31   0:00 nginx: worker process
root      10490  0.0  0.2 112708   976 pts/0    R+   17:08   0:00 grep --color nginx
[root@localhost ~]# kill 6885
[root@localhost ~]# ps aux | grep nginx
root      10520  0.0  0.2 112708   976 pts/0    S+   17:08   0:00 grep --color nginx

2.Linux系統(tǒng)中的killall、pkill命令用于殺死指定名字的進程。我們可以使用kill命令殺死指定進程PID的進程,如果要找到我們需要殺死的進程,我們還需要在之前使用ps等命令再配合grep來查找進程,而killall、pkill把這兩個過程合二為一,是一個很好用的命令。

---------使用pkill--------
[root@localhost ~]# ps aux | grep nginx
root      10536  0.0  0.2  46440   980 ?        Ss   17:10   0:00 nginx: master process nginx
nginx     10538  0.0  0.4  46852  1936 ?        S    17:10   0:00 nginx: worker process
root      10553  0.0  0.2 112708   972 pts/0    R+   17:10   0:00 grep --color nginx
[root@localhost ~]# pkill nginx
[root@localhost ~]# ps aux | grep nginx
root      10584  0.0  0.2 112708   976 pts/0    S+   17:10   0:00 grep --color nginx

---------使用killall--------
[root@localhost ~]# ps aux | grep nginx
root      10536  0.0  0.2  46440   980 ?        Ss   17:10   0:00 nginx: master process nginx
nginx     10538  0.0  0.4  46852  1936 ?        S    17:10   0:00 nginx: worker process
root      10553  0.0  0.2 112708   972 pts/0    R+   17:10   0:00 grep --color nginx
[root@localhost ~]# killall nginx
[root@localhost ~]# ps aux | grep nginx
root      10584  0.0  0.2 112708   976 pts/0    S+   17:10   0:00 grep --color nginx

2.管理后臺進程

1.什么是后臺進程

  • 通常進程都會在終端前臺運行,一旦關(guān)閉終端,進程也會隨著結(jié)束,那么此時我們就希望進程能在后臺運行,就是將在前臺運行的進程放入后臺運行,這樣及時我們關(guān)閉了終端也不影響進程的正常運行。

2.我們?yōu)槭裁匆獙⑦M程放入后臺運行

  • 比如:我們此前在國內(nèi)服務(wù)器往國外服務(wù)器傳輸大文件時,由于網(wǎng)絡(luò)的問題需要傳輸很久,如果在傳輸?shù)倪^程中出現(xiàn)網(wǎng)絡(luò)抖動或者不小心關(guān)閉了終端則會導(dǎo)致傳輸失敗,如果能將傳輸?shù)倪M程放入后臺,是不是就能解決此類問題了。

3.使用什么工具將進程放入后臺

  • 早期的時候大家都選擇使用&符號將進程放入后臺,然后在使用jobs、bg、fg等方式查看進程狀態(tài),但太麻煩了。也不直觀,所以我們推薦使用screen。

4.screen的使用(強烈推薦,生產(chǎn)必用)

#1.開啟一個screen窗口,指定名稱
[root@localhost ~]# screen -S wget
[screen is terminating]

#2.在screen窗口中執(zhí)行任務(wù)即可

#4.ctrl+a+d 平滑的退出screen,但不會終止screen中的任務(wù)。
注意: 如果使用exit或者ctrl+d(先使用ctrl+c)才算真的關(guān)閉screen窗口


#5.查看當(dāng)前正在運行的screen有哪些
[root@localhost ~]# screen -list
There is a screen on:
    10667.wget  (Detached)
1 Socket in /var/run/screen/S-root.
#6.進入正在運行的screen
[root@localhost ~]# screen -r
 wget

3.進程的優(yōu)先級[進階]

1.什么優(yōu)先級

  • 優(yōu)先級指的是優(yōu)先享受資源,比如排隊買票時,軍人優(yōu)先、老人優(yōu)先。等等

2.為什么要有系統(tǒng)優(yōu)先級

  • 舉個例子: 海底撈火鍋正常情況下響應(yīng)就特別快,那么當(dāng)節(jié)假日來臨時人員突增則會導(dǎo)致處理請求特別慢,那么假設(shè)我是海底撈VIP客戶(最高優(yōu)先級),無論門店多么繁忙,我都不用排隊,海底撈人員會直接服務(wù)于我,滿足我的需求。至于沒有VIP的人員(較低優(yōu)先級)則進入排隊等待狀態(tài)。(PS: 至于等多久,那.....)

3.系統(tǒng)中如何給進程配置優(yōu)先級?

  • 在啟動進程時,為不同的進程使用不同的調(diào)度策略。
    nice 值越高: 表示優(yōu)先級越低,例如+19,該進程容易將CPU 使用量讓給其他進程。
    nice 值越低: 表示優(yōu)先級越高,例如-20,該進程更不傾向于讓出CPU。

1.使用top或ps命令查看進程的優(yōu)先級

#1.使用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
1083 root      20   0  298628   2808   1544 S  0.3  0.1   2:49.28 vmtoolsd
5    root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:+

#2.使用ps查看進程優(yōu)先級
[root@localhosts ~]# ps axo command,nice |grep sshd|grep -v grep
/usr/sbin/sshd -D             0
sshd: root@pts/2              0

2.nice指定程序的優(yōu)先級。語法格式 nice -n 優(yōu)先級數(shù)字 進程名稱

#1.開啟vim并且指定程序優(yōu)先級為-5
[root@m01 ~]# nice -n -5 vim &
[1] 98417

#2.查看該進程的優(yōu)先級情況
[root@localhosts ~]# ps axo pid,command,nice |grep 98417
 98417 vim                         -5

3.renice命令修改一個正在運行的進程優(yōu)先級。語法格式 renice -n 優(yōu)先級數(shù)字 進程pid

#1.查看sshd進程當(dāng)前的優(yōu)先級狀態(tài)
[root@m01 ~]# ps axo pid,command,nice |grep 折疊shd
 70840 sshd: root@pts/2              0
 98002 /usr/sbin/sshd -D             0
 
#2.調(diào)整sshd主進程的優(yōu)先級
[root@localhosts ~]# renice -n -20 98002
98002 (process ID) old priority 0, new priority -20

#3.調(diào)整之后記得退出終端
[root@localhosts ~]# ps axo pid,command,nice |grep 折疊shd
 70840 sshd: root@pts/2              0
 98002 /usr/sbin/sshd -D           -20
[root@localhosts ~]# exit

#4.當(dāng)再次登陸sshd服務(wù),會由主進程fork子進程(那么子進程會繼承主進程的優(yōu)先級)
[root@localhosts ~]# ps axo pid,command,nice |grep 折疊shd
 98002 /usr/sbin/sshd -D           -20
 98122 sshd: root@pts/0            -20

4.系統(tǒng)平均負載[進階]

每次發(fā)現(xiàn)系統(tǒng)變慢時,我們通常做的第一件事,就是執(zhí)行 top 或者 uptime 命令,來了解系統(tǒng)的負載情況。比如像下面這樣,我在命令行里輸入了 uptime 命令,系統(tǒng)也隨即給出了結(jié)果。

[root@localhosts ~]# uptime
 04:49:26 up 2 days,  2:33,  2 users,  load average: 0.70, 0.04, 0.05
#我們已經(jīng)比較熟悉前面幾列,它們分別是當(dāng)前時間、系統(tǒng)運行時間以及正在登錄用戶數(shù)。

# 而最后三個數(shù)字呢,依次則是過去 1 分鐘、5 分鐘、15 分鐘的平均負載(Load Average)。

平均負載案例分析實戰(zhàn)

下面,我們以三個示例分別來看這三種情況,并用 stress、mpstat、pidstat 等工具,找出平均負載升高的根源。
stress 是 Linux 系統(tǒng)壓力測試工具,這里我們用作異常進程模擬平均負載升高的場景。
mpstat 是多核 CPU 性能分析工具,用來實時查看每個 CPU 的性能指標(biāo),以及所有 CPU 的平均指標(biāo)。
pidstat 是一個常用的進程性能分析工具,用來實時查看進程的 CPU、內(nèi)存、I/O 以及上下文切換等性能指標(biāo)。

#如果出現(xiàn)無法使用mpstat、pidstat命令查看%wait指標(biāo)建議更新下軟件包
wget http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm
rpm -Uvh sysstat-11.7.3-1.x86_64.rpm

場景一:CPU 密集型進程

------1.首先,我們在第一個終端運行 stress 命令,模擬一個 CPU 使用率 100% 的場景:------
[root@localhosts ~]# stress --cpu 1 --timeout 600

------2.接著,在第二個終端運行 uptime 查看平均負載的變化情況-----
# 使用watch -d 參數(shù)表示高亮顯示變化的區(qū)域(注意負載會持續(xù)升高)
[root@m01 ~]# watch -d uptime
17:27:44 up 2 days,  3:11,  3 users,  load average: 1.10, 0.30, 0.17

------3.最后,在第三個終端運行 mpstat 查看 CPU 使用率的變化情況-------
# -P ALL 表示監(jiān)控所有 CPU,后面數(shù)字 5 表示間隔 5 秒后輸出一組數(shù)據(jù)
[root@localhosts ~]# mpstat -P ALL 5
Linux 3.10.0-957.1.3.el7.x86_64 (m01)   2019年04月29日     _x86_64_    (1 CPU)

17時32分03秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17時32分08秒  all   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
17時32分08秒    0   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00

#單核CPU所以只有一個all和0

4.從終端二中可以看到,1 分鐘的平均負載會慢慢增加到 1.00,而從終端三中還可以看到,正好有一個 CPU 的使用率為 100%,但它的 iowait 只有 0。這說明,平均負載的升高正是由于 CPU 使用率為 100% 。那么,到底是哪個進程導(dǎo)致了 CPU 使用率為 100% 呢?可以使用 pidstat 來查詢

# 間隔 5 秒后輸出一組數(shù)據(jù)
[root@localhosts ~]# pidstat -u 5 1
Linux 3.10.0-957.1.3.el7.x86_64 (m01)   2019年04月29日     _x86_64_(1 CPU)

17時33分21秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
17時33分26秒     0    110019   98.80    0.00    0.00   98.80     0  stress

#從這里可以明顯看到,stress 進程的 CPU 使用率為 100%。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容