1. 程式人生 > >Linux學習-進程管理

Linux學習-進程管理

ps nice renice 子進程




目錄

  • 父進程與子進程

  • 服務

  • 工作管理(& | jobs | fg | bg | kill)

  • ps命令

  • Priority和nice優先級


父進程與子進程


子進程是父進程衍生出來的程序。舉個大家經常使用的例子,我們每次登陸的shell,會觸發一個進程,我們都是在這個shell下輸入命令進行工作的,其實呢,你輸入的命令也會觸發一個新的進程,這個新的進程就是子進程,而一開始登陸的shell進程則為父進程。我們做一個小實驗,我們在當前登陸shell下再登陸一個新的shell,然後輸入一個命令,查看進程的狀態信息

技術分享圖片

PID是該進程的識別碼,PPID是父進程的識別碼。我們發現第一個bash的PID和第二個bash的PPID都是2446,ping命令的PPID和第二個bash的PID都是2660,說明bash下輸入的命令都是當前bash的進程所產生的嘛。


服務(常駐內存)


在系統引導過程中就啟動的進程,我們稱之為守護進程,也叫服務,並且這類進程會持續的進行,提供系統和網絡所必須的功能。



工作管理


通常在當前bash下執行一個任務,必須等待這個任務執行完畢後才能輸入命令執行下一個任務,現在我們要進行文檔復制、資料查詢、軟件安裝等等多個任務同時工作,這就要用到工作管理的知識。


將任務轉到後臺(&)

直接在執行任務的命令後邊加&,然後我們可以輸入命令執行另一個任務從而實現多任務執行。例如,我們將/etc下的文件和目錄進行備份,同時不需要等待

[root@CentOS6 ~]# tar -zpc -f /app/etc.tar.gz /etc/* &
[1] 2948    # 2948代表PID
[root@CentOS6 ~]# tar: Removing leading `/' from member names
# 一段時間之後,出現如下信息代表該任務完成
[1]+  Done                    tar -zpc -f /app/etc.tar.gz /etc/*

這裏會有一個問題,如果對於那些會有顯示結果的命令,例如ping命令,使用&之後,終端會一直顯示ping命令的返回結果,這時候因為已經是後臺進程,用ctrl+c也不起作用,我們怎麽辦呢,我們可以用數據重定向,例如:

ping 172.18.0.1 > /tmp/txt 2>&1 &


查看後臺工作狀態(jobs)

如果想知道有多少進程在後臺工作,可以利用jobs命令查看,下圖為我的系統現在後臺工作的進程,顯示結果表示了後天進程的工作狀態等信息,註意前邊的+ -號,他們具有一定的含義,他們代表fg取用的順序。

技術分享圖片

jobs -l # 列出後臺進程的詳細信息,包括PID

-r # 僅列出正在運行的後臺進程

-s # 僅列出暫停的後臺進程


將後臺進程轉為前臺進程(fg)

我們想讓後臺進程轉到前臺來運行,可以使用fg命令。

fg # 默認將jobs命令顯示結果中帶 + 的轉到前臺

- # 將帶 - 的轉到前臺

%NUM # 將jobs顯示結果中指定的數字的進程轉到前臺


後臺進程Stopped轉為Running(bg)

下圖中,我輸入命令 /bin/ping 172.18.0.1 > /tmp/txt ,回車之後按下ctrl+z暫停該命令, ping命令的進程處於Stopped狀態,使用bg之後,變為Running狀態。

技術分享圖片

bg # 針對默認將jobs命令顯示結果中帶 + 的進程

- # 針對帶 - 的進程

%NUM # 針對jobs顯示結果中指定的數字的進程


殺死後臺進程(kill)

kill命令直接將後臺進程粗暴地終止移除,不夠這個命令有點特別,需要指定訊號來進行處理,我們先來看一下kill命令的用法:

kill -l # 查看能夠使用的signal,之後可以man 7 signal查看具體的效果

kill -signal %NUM | PID # kill命令的格式,%NUM為jobs命令顯示結果中的第一列數字

先介紹幾種常用的signal

kill -1 # 重新讀取一次配置參數的文件

kill -2 # 等同於ctrl+c

kill -9 # 強制刪除一個進程,例如,對於vim編輯文件file,不會主動刪除.file.swp

kill -15 # 正常終止一個進程,例如,對於vim,主動刪除.file.swp



ps命令


ps 顯示進程的運行狀況

ps -l # 僅顯示當前bash下的進程狀況

ps -lA # 顯示系統所有進程的信息,每一列字段代表的意義如下

F
進程的旗標(flag),為總結權限,4代表權限為root,1代表該子程序僅進行了復制
S運行狀態(stat),R=>運行,S=>睡眠,D=>堵塞,T=>停止狀態,Z=>僵屍狀態,已經終止但是無法移除內存
UID/PID/PPID進程的發起人/進程號/父進程號
C
CPU使用率,單位百分比
PRI/NI
priority/nice優先級
ADDR/SZ/WCHAN
ADDR代表進程在內存的那個部分,- 代表正在運行狀態;SZ代表進程所占內存大小;WCHAN代表進程是否在運行,- 表示正在運行
TTY
登陸者的終端機位置,若為遠程登錄則為pts/n
TIME
CPU運行該進程所費的時間
CMD該進程是什麽指令觸發的


ps aux # 不帶-,顯示系統所有的進程信息,每一列字段代表的意義如下

USER
進程的發起人
PID
進程號
%CPU
進程占用CPU百分比
%MEM進程占用物理內存百分比
VSZ/RSS
進程占用虛擬內存的大小/進程占用的固定內存的大小,可以理解為頁的數量
TTY

控制終端的ID,?代表與終端無關的進程,tty1-tty6為本機登錄終端,pts/n為遠程登錄終端

STAT進程狀態
START/TIME進程啟動的時間/進程實際占用CPU的時間
COMMAND
觸發進程的指令,如果後邊跟了<defunct>,表示這是一個僵屍進程


ps axjf # 同樣不帶 - ,進程之間具有相關性,該命令可以用類似程序樹的形式顯示進程信息


技術分享圖片

看圖中一段的顯示內容,我們可以看出,當前我是用sshd提供遠程網絡服務遠程登錄主機,該程序(父進程)提供一個bash環境(子進程),我在這個bash環境(父進程)下輸入命令ps axjf觸發了一個新的進程(子進程)



Priority和nice優先


技術分享圖片

linux會給予進程一個執行優先級priority(PRI),值越低優先級越高,PRI是系統核心動態控制調整,用戶無法進行更改,那麽我們如果想調整進程的優先級,而PRI又不能調整,我們引進了nice(NI)來使得用戶可以手動修改進程的運行優先級別。

nice值的取值範圍為-20--19,但是nice值的調整對用戶也有限制,root可以隨意調整自己和其他用戶的nice值普通用戶只能調整自己的nece值,並且調整範圍為0--19,防止nice為負值時搶占資源,同時nice值只能越調越高,不能降低nice值,PRI和NI具有一定的相關性:

PRI(new)=PRI(old)+NI

需要註意的是,從關系式來看,雖然NI可以影響進程的優先級,但是進程的優先級最終還要經過系統核心決定,所有我們不能簡單的理解PRI+NI。


nice # 對新建立的進程設定nice值


格式:nice -n NUM COMMAND # NUM範圍為-20--19

我們對vim命令設置nice值為5,原本預設的PRI值為bash的PRI(80),現在變為了85

技術分享圖片


renice # 重新調整已存在進程的nice值


格式:renice NUM PID # NUM範圍為-20--19,如果超出這個範圍,則自動調整為最近的-20或19

先查看進程bash的PRI和NI等信息,然後輸入renice命令修改bash進程的NI,修改完之後發現PRI和NI發生變化,同時我們也發現子進程也繼承了父進程的PRI和NI。

技術分享圖片



Linux學習-進程管理