時間:2017年04月07日程序員
說明:本文部份內容均摘取自書籍《Linux命令行與shell腳本編程大全》,版權歸原做者全部。《Linux命令行與shell腳本編程大全》(第三版)第四章學習總結正則表達式
本章內容:算法
管理進程 獲取磁盤統計信息 掛載新磁盤 排序數據 歸檔數據
Linux系統管理員面臨的最複雜的任務之一就是跟蹤運行在系統中的程序,尤爲是如今,圖形化桌面集成了大量的應用來生成一個完整的桌面環境。系統中老是運行着大量的程序。shell
當程序運行在系統上時,咱們稱之爲進程。想監測這些進程,須要熟悉ps命令的用法。編程
命令:ps數組
命令格式:ps 命令說明:ps命令只會顯示運行在當前控制檯下的屬於當前用戶的進程。 基本輸出顯示了程序的進程ID(ProcessID,PID)、它們運行在哪一個終端(TTY)以及進程已用CPU時間。
Linux系統中使用的GNU ps命令支持3中不一樣類型的命令行參數:安全
Unix風格的參數,前面加單破折線(-) BSD風格的參數,前面不加破折線() GNU風格的參數,前面加雙破折線(--)
1.Unix風格的參數bash
Unix風格的參數是從貝爾實驗室開發的AT&T Unix系統上原有的ps命令繼承下來的。這些命令以下:服務器
-A:顯示全部進程 -N:顯示與指定參數不符的全部進程 -a:顯示除控制進程和無終端進程外的全部進程 -d:顯示除控制進程外的全部進程 -e:顯示全部進程 -C cmdlist:顯示包含在cmdlist列表中的進程 -G grplist:顯示包含在grplist列表中的進程 -U userlist:顯示屬主的用戶ID在userlist列表中的進程 -g grplist:顯示會話或組ID在grplist列表中的進程 -p pidlist:顯示PID在pidlist列表中的進程 -s sesslist:顯示會話ID在sesslist列表中的進程 -t ttylist:顯示終端ID在ttylist列表中的進程 -u userlist:顯示有效用戶ID在userlist列表中的進程 -F:如今更多額外輸出(相對於-f參數而言) -O format:顯示默認的輸出列以及format列表指定的特定列 -M:顯示進程的安全信息 -c:顯示進程的額外調度器信息 -f:顯示完整格式的輸出 -j:顯示任務信息 -l:顯示長列表 -o format:僅顯示由format指定的列 -y:不要顯示進程標記(process flag,代表進程狀態的標記) -Z:顯示安全標籤信息 -H:用層級格式來顯示進程(樹狀,用來顯示父進程) -n namelist:定義了WCHAN列顯示的值 -w:採用寬輸出模式,不限款度顯示 -L:顯示進程中的線程 -V:顯示ps命令的版本號
使用ps命令的關鍵不在於記住全部可用的參數,而在於記住最有用的哪些參數。多線程
例如你想查看系統上運行的全部進程,可用ps -ef命令。ps命令容許你像這樣把參數組合在一塊兒。-e參數指定顯示全部運行在系統上的進程;-f參數則擴展了輸出,這些擴展的列包含了有用的信息。
以下:
UID:啓動這些進程的用戶 PID:進程的進程ID PPID:父進程的進程號(若是該進程是由另外一個進程啓動的) C:進程生命週期中的CPU利用率 STIME:進程啓動時的系統時間 TTY:進程啓動時的終端設備 TIME:運行進程須要的累計CPU時間 CMD:啓動的程序名稱
若是想要得到更多的信息,可採用-l參數,它會生產一個長格式輸出。注意使用了-l參數以後多出的那些列:
F:內核分配給進程的系統標記 S:進程的狀態 --O:表明正在運行 --S:表明正在休眠 --R:表明可運行,正等待運行 --Z:表明僵化,進程已結束但父進程已不存在 --T:表明中止 PRI:進程的優先級(越大的數字表明越低的優先級) NI:謙讓度值用來參與決定優先級 ADDR:進程的內存地址 SZ:假如進程被換出,所需交換空間的大體大小 WCHAN:進程休眠的內核函數的地址
2.BSD風格的參數
伯克利軟件發行版(Berkeley software distribution,BSD)是加州大學伯克利分校開發的一個Unix版本。它和AT&T Unix系統有許多細小的不一樣。BSD版的ps命令參數以下:
T:顯示跟當前終端關聯的全部進程 a:顯示跟任意終端關聯的全部進程 g:顯示全部的進程,包括控制進程 r:僅顯示運行中的進程 x:顯示全部的進程,甚至包括未分配任何終端的進程 U userlist:顯示歸userlist列表中某用戶ID全部的進程 p pidlist:顯示PID在pidlist列表中的進程 t ttylist:顯示所關聯的終端在ttylist列表中的進程 O format:除了默認輸出的列以外,還輸出由format指定的列 X:按過去的Linux i386寄存器格式顯示 Z:將安全信息添加到輸出中 j:顯示任務信息 l:採用長模式 o format:僅顯示由format指定的列 s:採用信息格式顯示 u:採用基於用戶的格式顯示 v:採用虛擬內存格式顯示 N namelist:定義在WCHAN列中使用的值 O order:定義顯示信息列的順序 S:將數值信息從子進程加到父進程上,好比CPU和內存的使用狀況 c:顯示真實的命令名稱(用以啓動進程的程序名稱) e:顯示命令使用的環境變量 f:用分層格式來顯示進程,表名哪些進程啓動了哪些進程 h:不顯示頭信息 k sort:指定用以將輸出排序的列 n:和ECHAN信息一塊兒顯示出來,用數值來表示用戶ID和組ID w:爲較寬屏幕顯示寬輸出 H:將線程按進程來顯示 m:在進程後顯示線程 L:列出全部格式指定符 V:顯示ps命令的版本號
在使用BSD參數時,ps命令會自動改變輸出以模仿BSD格式。使用ps l命令,其中大部分的輸出結果列跟使用Unix風格參數時的輸出是同樣的,只有一小部分不一樣。以下:
VSZ:進程在內存中的大小,以千字節(KB)爲單位 RSS:進程在未換出時佔用的物理內存 STAT:表明當前進程狀態的雙字符狀態碼
許多系統管理員都喜歡BSD風格的l參數。它能輸出更詳細的進程狀態碼(STAT列)。第一個字符采用了和Unix風格s列相同的值,代表進程是在休眠、運行仍是等待。第二個參數進一步說明進程的狀態。第二個參數說明:
<:該進程運行在高優先級上 N:該進程運行在低優先級上 L:該進程有頁面鎖定在內存中 s:該進程是控制進行 l:該進程是多線程的 +:該進程運行在前臺
3.GNU長參數
GNU開發人員在這個新改進過的ps命令中加入了另一些參數。其中一些GNU長參數複製了現有的Unix或BSD類型的參數,而另外一些則提供了新功能。現有的GNU長參數以下:
--deselect:顯示全部進程,命令行中列出的進程 --Gruop grplist:顯示組ID在grplist列表中的進程 --User userlist:顯示用戶ID在userlist列表中的進程 --group grplist:顯示有效組ID在grplist列表中的進程 --pid pidlist:顯示PID在pidlist列表中的進程 --ppid pidlist:顯示父PID在pidlist列表中的進程 --sid sidlist:顯示會話ID在sidlist列表中的進程 --tty ttylist:顯示終端設備號在ttylist列表中的進程 --user userlist:顯示有效用戶ID在userlist列表中的進程 --format format:僅顯示有format指定的列 --context:顯示額外的安全信息 --cols n:將屏幕寬度設置爲n列 --columns n:將屏幕寬度設置爲n列 --cunulative:包含已中止的子進程的信息 --forest:用層級結構顯示出進程和父進程之間的關係 --headers:在每頁輸出中都顯示列的頭 --no-headers:不顯示列的頭 --lines n:將屏幕高度設爲n行 --rows n:將屏幕高度設爲n排 --sort order:指定將輸出按哪列排序 --width n:將屏幕寬度設爲n列 --help:顯示幫助信息 --info:顯示調試信息 --version:顯示ps命令的版本號
能夠將GNU長參數和Unix或BSD風格的參數混合用來定製輸出。GNU長參數中一個着實讓人喜好的功能就是--forest參數。它會顯示進程的層級信息,並用ASCII字符繪出可愛的圖表。這種格式讓跟蹤子進程和父進程變得十分容易。
ps命令雖然在收集運行在系統上的進程信息時很是有用,但也有不足之處:它只能顯示某個特定時間點的信息。若是想觀察那些頻繁換進換出的內存的進程趨勢,用ps命令就不方便了。而top命令恰好適用這種狀況。
命令:top
命令格式:top 命令說明:top命令跟ps命令類似,可以顯示進程信息,但它是實時顯示的。 注意:按q鍵退出。
top顯示分爲兩部分:第一部分爲系統整體概況;第二部分爲進程詳細列表。
第一部分:系統整體概況
第一行顯示了當前時間、系統運行時間、登陸的用戶數以及系統的平均負載。 --平均負載有三個值:最近1分鐘的、最近5分鐘的和最近15分鐘的平均負載。 --值越大說明系統的負載越高。 --若是近15分鐘內的平均負載都很高,就說明系統可能有問題。 --一般,若是系統的負載值超過了2,就說明系統比較繁忙了。 第二行顯示了進程概要信息,top命令的輸出中將進程叫做任務(task):有多少進程處在運行、休眠、中止或是僵化狀態(僵化狀態是指進程完成了,但父進程沒有響應)。 第三行顯示了CPU的概要信息。top根據進程的屬主(用戶仍是系統)和進程的狀態(運行、空閒仍是等待)將CPU利用率分紅幾類輸出。 第四行說的是系統的物理內存:總共有多少內存,當前用了多少,還有多少空閒。 第五行顯示的也是系統的物理內存,不過是針對系統交換空間(若是分配了的話)的狀態而言的。
第二部分:進程詳細列表
第二部分顯示了當前運行中的進程的詳細列表,有些列跟ps命令的輸出相似。具體以下:
PID:進程的PID USER:進程屬主的名字 PR:進程的優先級 NI:進程的謙讓度值 VIRT:進程佔用的虛擬內存總量 RES:進程佔用的物理內存總量 SHR:進程和其餘進程共享的內存總量 S:進程的狀態 --D:表明可中斷的休眠狀態 --R:表明在運行狀態 --S:表明休眠狀態 --Z:表明僵化狀態 --T:表明中止或跟蹤狀態 %CPU:進程使用的CPU時間比例 %MEM:進程使用的內存佔可用內存的比例 TIME+:自進程啓動到目前爲止的CPU時間總量 COMMAND:進程所對應的命令行名稱,也就是啓動的程序名
在Linux中,進程以前經過信號來通訊。進程的信號就是預約義好的一個消息,進程能識別它並決定忽略仍是作出反應。進程如何處理信號是由開發人員經過編程來決定的。這些信號以下:
信號:名稱:描述 1:HUB:掛起 2:INT:中斷 3:QUIT:結束運行 9:KILL:無條件終止 11:SEGV:段錯誤 15:TERM:儘量終止 17:STOP:無條件中止運行,但不終止 18:TSTP:中止或暫停,但繼續在後臺運行 19:CONT:在STOP或TSTP以後恢復執行
在Linux上有兩個命令能夠向運行中的進程發出進程信號。
1.kill命令
要發送進程信號,你必須是進程的屬主或登陸爲root用戶。
命令:kill
命令格式:kill PID 命令說明:默認狀況下,kill命令會向命令行中列出的PID出送一個TERM信號。TERM信號告訴進程儘量的話就中止運行。不過有時候進程一般會忽略這個請求。 命令演示:kill 3940 演示說明:儘量的終止PID爲3940的進程。 命令格式:kill -s 信號名或信號值 PID 命令說明:若是要強制終止,-s參數支持指定其餘信號(用信號名或信息值)。 命令演示:kill -9 3490 演示說明:強制無條件終止PID爲3490的進程。提示:要檢查kill命令是否有效,可再運行ps或top命令,看看問題進程是否已中止。
2.killall命令
killall命令很是強大,它支持經過進程名而不是PID來結束進程。killall命令也支持通配符,這在系統因負載過大而變得很慢時頗有用。
命令:killall
命令演示:killall http* 演示說明:上例中的命令結束了全部以http開頭的進程,好比Apcahe Web服務器的httpd服務。
警告:以root用戶身份登陸系統時,使用killall命令要特別當心,由於很容易就會誤用通配符而結束了重要的系統進程。這可能會破壞文件系統。
在今天的圖形化桌面環境裏,大多數Linux發行版都能自動掛載特定類型的可移動存儲媒體。
1.mount命令
Linux上用來掛載媒體的命令叫做mount。默認狀況下,mount命令會輸出當前系統上掛載的設備列表。mount命令提供以下四部分信息:
媒體的設備文件名 媒體掛載到虛擬目錄的掛載點 文件系統類型 已掛載媒體的訪問狀態
Linux能夠識別很是多的文件系統類型。若是是和Windows PC共用這些存儲設備,經過得使用如下文件系統類型:
vfat:Windows長文件系統 ntfs:Windows NT、XP、Vista以及Windows7中普遍使用的高級文件系統 iso9660:標準CD-ROM文件系統
命令:mount
命令格式:mount -t type device directory 命令說明:type參數指定了磁盤被格式化的文件系統類型。後面兩個參數定義了該存儲設備的設備文件的位置以及掛載在虛擬目錄中的位置。 命令演示:mount -t vfat /dev/sdb1 /media/disk 演示說明:手動將U盤/dev/sdb1掛載到/media/disk。
要手動在虛擬目錄中掛載設備,須要以root用戶身份登陸,或是以root用戶身份運行sudo命令。媒體掛載到了虛擬目錄後,root用戶就有了該設備的全部訪問權限,而其餘用戶的訪問則會被限制。你能夠經過目錄權限(將在第七章介紹)指定用戶對設備的訪問權限。
若是要用到mount命令的一些高級功能,可用參數以下:
-a:掛載/etc/fstab文件中指定的全部文件系統 -f:使mount命令模擬掛載設備,但並不真的掛載 -F:和-a參數一塊兒使用時,會同時掛載全部文件系統 -v:詳細模式,將會說明掛載設備的每一步 -I:i:不啓用任何/sbin/mount.filesystem下的文件系統幫助文件 -l:L:給ext二、ext3和XFS文件系統自動添加文件系統標籤 -n:掛載設備,但不註冊到/etc/mtab已掛帳設備文件中 -p num:進行加密掛載時,從文件描述符num中得到密碼短語 -s:忽略該文件系統不支持的掛載選項 -r:將設備掛載爲只讀的 -w:將設備掛載爲可讀寫的(默認參數) -L label:將設備按指定的label掛載 -U uuid:將設備按指定的uuid掛載 -O:和-a參數一塊兒使用,限制命令只做用到特定的一組文件系統上 -o:給文件系統添加特定的選項
-o參數容許在掛載文件系統時添加一些逗號分隔的額外選項。如下爲經常使用的選項:
ro:以只讀形式掛載 rw:以讀寫形式掛載 user:容許普通用戶掛載文件系統 check=none:掛載文件系統時不進行完整性校驗 loop:掛載一個文件
2.umount命令
從Linux系統上移除一個可移動設備時,不能直接從系統上移除,而應該先卸載。
竅門:Linux上不能直接彈出已掛載的CD。若是你在從光驅中移除CD時遇到麻煩,一般是由於該CD還掛載在虛擬目錄裏。先卸載它,而後再去嘗試彈出。
命令:umount
命令格式:umount [ directory | device ] 命令說明:卸載設備。若是有任何程序正在使用設備上的文件,系統就不會容許你卸載它。
命令:df
命令格式:df 命令說明:df命令會顯示有數據的已掛載文件系統。
命令輸出以下:
設備的設備文件位置 能容納多少個1024字節大小的塊 已用了多少個1024字節大小的塊 還有多少個1024字節大小的塊可用 已用空間所佔的比例 設備掛載到了哪一個掛載點上
使用-h參數,使輸出結果可讀。
命令格式:df -h 命令說明:按照用戶已讀的形式顯示,一般用M來替代兆字節,用G替代吉字節。
命令:du
命令格式:du 命令說明:du命令能夠顯示某個特定目錄的磁盤使用狀況。默認狀況下,會顯示當前目錄下全部的文件、目錄的磁盤使用狀況。
du命令經常使用的參數:
-c:顯示全部已列出文件總大小。 -h:按用戶易讀的格式輸出大小。 -s:顯示每一個輸出參數的總計。
命令:sort
命令格式:sort file 命令說明:sort命令會按照會話指定的默認語言的排序規則對文本文件中的數據進行排序。
一些經常使用的sort參數:
-b:排序時忽略起始的空白 -C:不排序,若是數據無序也不要報告 -c:不排序,但檢查輸入數據是否是已排序;未排序的話,報告 -d:僅考慮空白和字母,不考慮特殊字符 -f:默認狀況下,會將大寫字母排在前面;這個參數會忽略大小寫 -g:按通用數字來排序 -i:在排序時忽略不可打印字符 -M:用三字符月份名按月份排序 -m:將兩個已排序數據文件合併 -n:按字符串數值來排序 -o:將排序結果寫出到指定的文件中 -R:按隨機生成的散列表的鍵值排序 -r:反序排序 -S:指定使用的內存大小 -s:禁用最後重排序比較 -T:指定一個位置來存儲臨時工做文件 -t:指定一個用來區分鍵位置的字符 -u:和-c參數一塊兒使用時,檢查嚴格排序;不和-c參數一塊兒使用時,僅輸出第一例類似的兩會 -z:用NULL字符做爲行尾,而不是用換行符
命令:grep
命令格式:grep [options] pattern [file] 命令說明:grep命令行會在輸入或指定的文件中查找包含匹配指定模式的字符的行。 命令演示:grep three file 命令說明:在file文件中查找包含three的行。
grep命令比較經常使用的參數:
-v:進行反向搜索 -n:顯示匹配模式的行所在的行號 -c:顯示有多少行含有匹配的模式 -e:指定多個匹配模式,默認顯示含有多個匹配模式的全部行
grep的匹配模式支持使用正則表達式。將在第二十章介紹正則表達式。
Linux包含了多種文件壓縮工具。雖然聽上去不錯,但這實際上常常會在用戶下載文件時形成混淆。
如下是Linux上的文件壓縮工具:
工具:文件擴展名:描述 bzip2:.bz2:採用Burrows-Wheeler塊排序文件壓縮算法和霍夫曼編碼 compress:.Z:最初的Unix文件壓縮工具,已經快沒人用了 gzip:.gz:GNU壓縮工具,用Lempel-Ziv編碼 zip:.zip:Windows上PKZIP工具的Unix實現
gzip是Linux上最流行的壓縮工具。gzip是GNU項目的產物,包含如下工具:
gzip:用來壓縮文件 gzcat:用來查看壓縮過的文本文件的內容 gunzip:用來解壓文件
命令:gzip
命令格式:gzip 文件 命令說明:對指定文件進行壓縮 命令演示:gzip demo.sh 演示說明:壓縮demo.sh文件
命令:gunzip
命令格式:gunzip文件 命令說明:對指定文件進行解壓 命令演示:gzip gunzip.sh.gz 演示說明:解壓demo.sh壓縮文件
tar命令的功能:
-A:將一個已有tar歸檔文件追加到另外一個已有tar歸檔文件 -c:建立一個新的tar歸檔文件 -d:檢查歸檔文件和文件系統的不一樣之處 -r:追加文件到已有tar歸檔 -t:列出已有tar歸檔文件的內容 -u:將此tar歸檔文件中已有的同名文件新的文件追加到該tar歸檔文件中 -x:從已有tar歸檔文件中提取文件
tar命令選項:
-C dir:切換到指定目錄 -f file:輸出結果到文件或設備file -j:將輸出結果重定向給bzip2命令來壓縮內容 -p:保留全部文件權限 -v:在處理文件時顯示文件 -z:將輸出重定向給gzip命令來壓縮內容
命令:tar
命令格式:tar function [options] object1 object2 ... 命令說明:將文件object1和object2等待歸檔到一個tar文件中。 命令演示:tar -cvf test.tar test/ test2/ 演示說明:建立了名爲test.tar的歸檔文件,含有test和test2目錄內容。 命令格式:tar -xvf 文件 命令說明:從tar文件中提取文件。 命令格式: tar zcvf demo.tar.gz demo【推薦使用】 命令說明:將文件夾壓縮爲.tar.gz文件。 命令格式:tar zxvf demo.tar.gz 命令說明:將壓縮文件解壓。
竅門:下載了開源軟件以後,你會常常看到文件名以。tgz結尾。這些是gzip壓縮過的tar文件能夠用命令tar -zxvf filename.tgz來解壓。
本章討論了Linux系統管理員和程序員用到的一些高級bash命令。主要介紹了ps、top、kill、killall、mount、umount、df、du、sort、grep、gzip、gzcat、gunzip、tar命令。
本章學習命令我的總結以下:
ps:查看系統進程相關信息 top:實時監測系統進程相關信息 kill:經過PID結束單個進程 killall:經過進程名或通配符來結束多個進程 mount:掛載存儲媒體,如:U盤,CD等 umount:卸載存儲媒體 df:查看磁盤的使用狀況 du:查看目錄或文件的大小 sort:對文本文件的內容進行排序 grep:搜索數據,在輸入或指定的文件中查找包含匹配指定模式的字符的行 gzip:壓縮文件 gzcat:查看壓縮過的文本文件的內容 gunzip:解壓文件 tar:歸檔數據,可以對文件和目錄進行壓縮和解壓縮