目錄
linux
父進程與子進程shell
守護進程Daemonvim
進程管理bash
查看進程網絡
計劃任務app
Priority和nice優先級
ssh
1、父進程與子進程
ide
子進程是父進程衍生出來的程序。舉個你們常用的例子,咱們每次登錄的shell,會觸發一個進程,咱們都是在這個shell下輸入命令進行工做的,其實呢,你輸入的命令也會觸發一個新的進程,這個新的進程就是子進程,而一開始登錄的shell進程則爲父進程。咱們作一個小實驗,咱們在當前登錄shell下再登錄一個新的shell,而後輸入一個命令,查看進程的狀態信息。
工具
PID是該進程的識別碼,PPID是父進程的識別碼。咱們發現第一個bash的PID和第二個bash的PPID都是2446,ping命令的PPID和第二個bash的PID都是2660,說明bash下輸入的命令都是當前bash的進程所產生的嘛。url
2、守護進程Daemon(常駐內存)
在系統引導過程當中就啓動的進程,咱們稱之爲守護進程(Daemon),Windows下叫服務,而且這類進程會持續的進行,提供系統穩定性和網絡所必須的功能。
前臺進程和後臺進程的區別:
前臺和後臺的區分依據是控制終端界面,和終端交互的進程爲前臺進程,此類進程須要及時對終端作出響應,具備較高的優先級;而和終端不進行交互的進程爲後臺進程,此類進程不須要對終端作出響應,優先級較低。前臺進程和後臺進程能夠進行切換,注意,同時後臺進程也分爲依附於終端的後臺進程和不依附於終端的後臺進程,對於那些徹底不受終端控制的後臺進程則不能切換到前臺。
守護進程是後臺進程的一種
進程 |
區分依據: 是否與終端進行交互 |
前臺進程 | 與終端交互 | |
後臺進程 |
不與終端交互 | 且依附於終端的後臺進程(能夠與前臺進程進行切換) | ||
而不依附於終端的後臺進程(例如守護進程) |
3、進程管理
一般在當前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、查看進程相關命令
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
-----------------------------------------------------------------
當前時間 | 運行時間 | 鏈接用戶 | 一、五、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、計劃任務
計劃任務可讓系統在將來某個時間執行命令。
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 表示在範圍內的步長
6、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。