目錄
父進程與子進程
守護進程Daemon
進程管理
查看進程
計劃任務
Priority和nice優先級
一、父進程與子進程
子進程是父進程衍生出來的程序。舉個大家經常使用的例子,我們每次登陸的shell,會觸發一個進程,我們都是在這個shell下輸入命令進行工作的,其實呢,你輸入的命令也會觸發一個新的進程,這個新的進程就是子進程,而一開始登陸的shell進程則爲父進程。我們做一個小實驗,我們在當前登陸shell下再登陸一個新的shell,然後輸入一個命令,查看進程的狀態信息。
PID是該進程的識別碼,PPID是父進程的識別碼。我們發現第一個bash的PID和第二個bash的PPID都是2446,ping命令的PPID和第二個bash的PID都是2660,說明bash下輸入的命令都是當前bash的進程所產生的嘛。
二、守護進程Daemon(常駐內存)
在系統引導過程中就啓動的進程,我們稱之爲守護進程(Daemon),Windows下叫服務,並且這類進程會持續的進行,提供系統穩定性和網絡所必須的功能。
前臺進程和後臺進程的區別:
前臺和後臺的區分依據是控制終端界面,和終端交互的進程爲前臺進程,此類進程需要及時對終端做出響應,具有較高的優先級;而和終端不進行交互的進程爲後臺進程,此類進程不需要對終端做出響應,優先級較低。前臺進程和後臺進程可以進行切換,注意,同時後臺進程也分爲依附於終端的後臺進程和不依附於終端的後臺進程,對於那些完全不受終端控制的後臺進程則不能切換到前臺。
守護進程是後臺進程的一種
進程 | 區分依據: 是否與終端進行交互 | 前臺進程 | 與終端交互 | |
後臺進程 | 不與終端交互 | 且依附於終端的後臺進程(可以與前臺進程進行切換) | ||
而不依附於終端的後臺進程(例如守護進程) |
三、進程管理
通常在當前bash下執行一個任務,必須等待這個任務執行完畢後才能輸入命令執行下一個任務,現在我們要進行文檔複製、資料查詢、軟件安裝等等多個任務同時工作,這就要用到進程管理的知識。
3.1 將任務轉到後臺(&)
直接在執行任務的命令後邊加&,然後我們可以輸入命令執行另一個任務從而實現多任務執行。例如,我們將/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 &
3.2 查看後臺工作狀態(jobs)
如果想知道有多少進程在後臺工作,可以利用jobs命令查看,下圖爲我的系統現在後臺工作的進程,顯示結果表示了後臺進程的工作狀態等信息,特別注意,jobs命令顯示的依附於終端的後臺進程,另一個注意的是前邊的+ -號,他們具有一定的含義,他們代表fg取用的順序。
jobs -l # 列出後臺進程的詳細信息,包括PID
-r # 僅列出正在運行的後臺進程
-s # 僅列出暫停的後臺進程
3.3 將後臺進程轉爲前臺進程(fg)
我們想讓後臺進程轉到前臺來運行,可以使用fg命令。
fg # 默認將jobs命令顯示結果中帶 + 的轉到前臺
- # 將帶 - 的轉到前臺
%NUM # 將jobs顯示結果中指定的數字的進程轉到前臺
3.4 後臺進程Stopped轉爲Running(bg)
下圖中,我輸入命令 /bin/ping 172.18.0.1 > /tmp/txt ,回車之後按下ctrl+z暫停該命令, ping命令的進程處於Stopped狀態,使用bg之後,變爲Running狀態。
bg # 針對默認將jobs命令顯示結果中帶 + 的進程
- # 針對帶 - 的進程
%NUM # 針對jobs顯示結果中指定的數字的進程
3.5 殺死後臺進程(kill)
kill命令直接將後臺進程粗暴地終止移除,不過這個命令有點特別,需要指定訊號來進行處理,我們先來看一下kill命令的用法:
kill -l # 查看能夠使用的signal,之後可以man 7 signal查看具體的效果
kill -signal %NUM | PID # kill命令的格式,%NUM爲jobs命令顯示結果中的第一列數字
先介紹幾種常用的signal
kill -0 # 無作爲,可以用來單純的判斷進程是否可以運行
kill -1 # 強制進程重新讀取配置參數的文件
kill -2 # 終止正在運行的進程,等同於ctrl+c
kill -9 # 強制刪除一個進程,例如,對於vim編輯文件file,不會主動刪除.file.swp
kill -15 # 正常終止一個進程,例如,對於vim,主動刪除.file.swp
killall 進程名 # 根據進程名殺死父進程及其子進程,和上面的依據PID不一樣
pkill -u 用戶名 # 殺死指定用戶運行的所有進程
pkill -t 終端名 # 殺死指定終端運行的所有進程
輸入 pkill -u lisi 之後,ps aux 查看進程結果
3.6 將後臺進程脫離終端
對於那些依附於終端的後臺進程,如果把終端關閉之後,該終端的進程都將關閉,那麼有什麼解決這種問題的方法。
nohup command &> /dev/null
screen ; command
四、查看進程相關命令
4.1 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觸發了一個新的進程(子進程)。
4.2 搜索進程(egrep)
pgrep -u UID/用戶名 # 基於用戶名搜索進程
-l# 顯示進程名
[root@CentOS6 ~]# pgrep -l -u root # 注意這裏的-u和用戶名必須寫一起
pgrep -t 終端名 # 基於終端名搜索進程
[root@CentOS6 ~]# pgrep -l -t pts/1
pgrep -P PID # 搜索進程的子進程
[root@CentOS6 ~]# service httpd status httpd (pid 2692) is running... [root@CentOS6 ~]# pgrep -l -P 2692 2695 httpd 2696 httpd 2697 httpd 2698 httpd 2699 httpd 2700 httpd 2701 httpd 2702 httpd [root@CentOS6 ~]#
pidof 進程名 # 查詢進程名的PID(包括子進程)
[root@CentOS6 ~]# pidof httpd 2702 2701 2700 2699 2698 2697 2696 2695 2692
4.3 系統工具
uptime 打印系統總共運行了多長時間和系統的平均負載,特定時間間隔內系統運行隊列中的平均進程數叫做平均負載
對於一個雙核CPU的話,當平均負載達到6的時候,說明CPU已經充分利用
[root@CentOS6 ~]# uptime
09:49:42 |up 30 min,| 2 users,| load average: 0.00, 0.00, 0.00
-----------------------------------------------------------------
當前時間 | 運行時間 | 連接用戶 | 1、5、10分鐘的平均負載
[root@CentOS6 ~]# uptime 09:49:42 up 30 min, 2 users, load average: 0.00, 0.00, 0.00 [root@CentOS6 ~]# dd if=/dev/zero of=/dev/null & # 通過無限寫入操作,觀察系統的負載 [1] 2779 [root@CentOS6 ~]# uptime 09:55:52 up 36 min, 2 users, load average: 0.15, 0.03, 0.01 [root@CentOS6 ~]# uptime 09:55:53 up 36 min, 2 users, load average: 0.15, 0.03, 0.01 [root@CentOS6 ~]# uptime 09:55:55 up 36 min, 2 users, load average: 0.15, 0.03, 0.01 [root@CentOS6 ~]# uptime 09:55:55 up 36 min, 2 users, load average: 0.15, 0.03, 0.01 [root@CentOS6 ~]# uptime 09:55:56 up 37 min, 2 users, load average: 0.15, 0.03, 0.01 [root@CentOS6 ~]# uptime 09:55:57 up 37 min, 2 users, load average: 0.22, 0.05, 0.02 # 負載發生變化 [root@CentOS6 ~]# uptime 09:55:57 up 37 min, 2 users, load average: 0.22, 0.05, 0.02 [root@CentOS6 ~]# uptime 09:55:58 up 37 min, 2 users, load average: 0.22, 0.05, 0.02
動態監控進程狀況(top)
top -d NUM # 指定刷新時間間隔,默認3s
top -b # 顯示所有進程
top -n NUM # 刷新多少次後退出
top命令有許多內置命令,可以改變top命令的顯示效果
排序
P 根據CPU百分比,默認
M 根據內存百分比
T 根據CPU運行時間
首部信息顯示(如下)# 執行相應內置命令會使得對應行內容顯示或消失
top - 10:09:11 up 50 min, 2 users, load average: 0.00, 0.00, 0.00 ==> l(字母) Tasks: 147 total, 1 running, 146 sleeping, 0 stopped, 0 zombie ==> t 同時改變Tasks和Cpu Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st ==> 1(數字) Cpu1 : 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 2038352k total, 236156k used, 1802196k free, 24860k buffers ==> m 改變Mem和Swap Swap: 4194300k total, 0k used, 4194300k free, 65400k cached
退出top :q
修改刷新時間間隔:s + 間隔時間(單位S)
殺死指定進程:k + PID
保存至文件:W(大寫) # 保存至/root/.toprc文件中
htop # 該命令需要從epel源安裝,提供更多top沒有的功能
安裝過程:
配置epel源
1 [mage-epel]
2 name=mage-epel
3 baseurl=http://172.18.0.1/fedora-epel/6/x86_64/
4 gpgcheck=0
yum search htop,發現存在htop的軟件包
yum -y install htop
htop命令顯示效果如下:
五、計劃任務
計劃任務可以讓系統在未來某個時間執行命令。
5.1 at
at命令只是臨時的計劃任務,在成功一次之後就會失效。這是一個依賴於atd服務的命令,如果該服務停止,則該命令不會生效。另外,在制定了計劃任務之後,即使重啓系統,該計劃任務還是有效的,因爲系統把at計劃任務寫入到了硬盤中。對應的相關目錄是/var/spool/at,如下圖:
用法:
at HH:MM [YYYY-MM-DD] 自定義任務 ctrl d ******************************* 或者 echo 內容 | at HH:MM [YYYY-MM-DD] ******************************* 或者 at HH:MM [YYYY-MM-DD] << EOF 內容 EOF ******************************* 或者 編輯文件內容 at HH:MM [YYYY-MM-DD] -f 文件名
制定at計劃任務的時間
at 設置的時間如果和當前時間衝突,則系統自動判定爲第二天的這個時間
at noon # 表示12:00
at midnight # 表示00:00
at teatime # 表示16:00
at now+n{minutes,years,days,weeks} # 表示指定多長時間之後
at命令的選項
at -V # 顯示版本信息
at -l # 顯示計劃任務,等同於命令atq
at -c n # 查看指定計劃任務的詳細信息,等同於命令atrm
at -d n # 刪除指定計劃任務
at -m # 當到了指定時間後,無論任務執行正確與否,都將會發送郵件給用戶
限制用戶使用at制定計劃任務
/etc/at.deny 禁止使用at的用戶名單
/etc/at.allow 語序使用at的用戶名單
當/etc/at.allow存在時,/etc/at.deny失效。當/etc/at.allow和/etc/at.deny都不存在時,只有root才能使用at。
5.2 cron
cron是週期性的計劃任務,依賴於crond服務,不過cron計劃任務需要直接對文件進行修改才能實現,這個文件就是/etc/crontab
/etc/crontab內容如下:
時間表示法:
①特定值
②* 表示取值範圍內的所有值
③N,N,N 表示離散取值
④N-N 表示連續取值
⑤/N 表示在範圍內的步長
六、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。