Linux學習-進程管理
目錄
父進程與子進程
服務
工作管理(& | 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學習-進程管理