實戰爲上!深刻解析20個運維命令linux
http://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=2650652657&idx=1&sn=30d1fa71582eecbbe1417823e2c075f4&scene=1&srcid=0824gkjG29MCukC5Poclz7p7&from=groupmessage&isappinstalled=0#wechat_redirectios
吳鵬衝,Linux大鵬博主,擅長技術寫做。曾供職百度運維部七年,前後擔任過運維負責人、運維平臺開發組成員、監控產品經理三個角色。
直播實錄實戰爲上!深刻解析20個運維命令
按照慣例,我先作個自我介紹,讓你們可以更瞭解個人經歷和背景,若是哪位小夥伴和我有共同的經歷或愛好,歡迎加我好友!
我在北郵計算機學院讀了本科和碩士,畢業後便進入了百度運維部,一直工做了將近七年。
在百度期間,我作過OP,運維工程師;也作過RD,研發工程師,最後作了一年半的產品經理,負責百度內外部的監控系統。
去年年末,到今年年中,和兩個小夥伴楊文強(CTO)、張昱(美國章魚哥)寫了《Linux大棚命令百篇》上下冊,但願能讓Linux工程師實現Linux命令的快速入門和進階。
你們微信搜索並關注「Linux大棚」公衆號後,就能夠看到新書的介紹啦。
如今的我,在和一羣小夥伴作一個創業項目,是關於「互聯網+足球」的,但願能經過「技術」和「互聯網思惟」,讓人們感覺到足球的樂趣。
若是哪位小夥伴,既熱愛技術,又喜好足球,歡迎找我私聊哦。
另外,百度七年,我積累了一些經驗、體會和感覺,若是你們想了解,能夠找我開小竈哈。
我能和你們分享的話題大概是這些:
- 互聯網行業和互聯網公司雜談 - 運維行業的前景、運維工程師的職責和前途- 在百度運維部工做的體驗 - PM/RD/OP/SYS各個角色的特色以及職業發展規劃 - 技術崗位的職業瓶頸討論 - 如何快速入門Linux - 運維繫統和平臺的知識,尤爲是監控系統 - 如何堅持技術寫做並不斷進步 - 寫書的整個過程和經驗談。
閒言少敘,咱們今天就爲你們帶來一個很是很是實用的話題,那就是「深刻解析最經常使用的20個Linux運維命令」。
因爲時間有限,咱們只有大概一堂課的時間,也就是45分鐘,要講20個高級命令,並不是易事。我會略有側重,一些命令會全面講解,另外一些命令則會只介紹最重要的使用場景。
若是你們但願在很短的時間內,快速深刻最經常使用的Linux命令,能夠購買我新出的書,不會讓你們失望的。好,咱們如今正式開始課程啦!
接觸過計算機網絡的同窗必定都知道ping命令吧,當計算機聯網出現問題時,第一個進入腦海的解決方法就是「ping一下網絡唄」。
ping的最經常使用的用法,是這樣的:
能夠看出,咱們使用了-c選項來指定ping的次數,參數指定爲3,就表示ping三次。
若是你是處女座,不想看到每一次ping的過程,只想看到最後的統計結果,那有沒有辦法知足處女座這個小小的願望呢?
固然有。只需簡單地增長-q選項就好了,q就是quiet的首字母。
默認狀況下,ping命令發送的兩個數據包之間的間隔是 1 秒,若是咱們嫌默認1秒發送一個 ping 包太慢,則可使用 -i 選項來指定發送兩個 ping 包之間的時間間隔。
不過須要注意的是,只有root用戶才能設置低於0.2 秒的時間間隔哦。
在運維工做中,若是你想高強度地驗證網絡的可靠性,可使用flood ping。web
ping -f -c 1000000 10.70.10.250
如圖所示,咱們使用了-f 選項,即 flood ping,潮水模式的ping。
這裏有一個知識點要注意,flood ping 會採用無間隔的方式盡全力發送探測數據包,確保每秒鐘至少發送100 個。咱們把這種模式形象地稱爲「瘋狂模式」,注意,只有root帳戶纔有瘋狂的權力哦。
最後,咱們給出在網絡實際使用過程當中的一些RTT參考值,但願對你排查網絡問題能有必定的幫助。
對了,RTT,是指Round-Trip Time,往返時延。ping本機: 0.01ms ping同機房機器: 0.1ms ping同城機器: 1ms ping不一樣城機器: 20ms 北(南)方ping南(北)方機器: 50ms 從國內ping國外機器: 200ms
提醒你們:網絡很複雜,狀況不少變,上述數據僅供參考。
咱們抓緊時間來爲你們介紹一下第2個命令——nslookup 。
經過man nslookup ,咱們能夠看到nslookup的官方解釋是「query Internet name servers interactively 」。
而nslookup是name server lookup的縮寫,顧名思義,nslookup就是「用來查詢DNS的」 。
因爲nslookup命令涉及到DNS協議知識,因此,咱們在書中提早講解了DNS的相關知識,好比DNS的三種查詢過程(遞歸、迭代、混合)等。
因爲時間有限,咱們就不在這裏細緻展開啦,相信你們對DNS協議應該都有必定程度的掌握。
假如你想知道www.baidu.com 對應的IP地址的話,那麼用nslookup 應該是最正確的方法了。
能夠看出,nslookup的輸出包含了上下兩部分。
1.上半部分:DNS服務器信息。 2. 下半部分:域名解析信息。
DNS 服務器信息中包含了兩行內容,就是下面兩行:Server: 223.5.5.5 Address: 223.5.5.5#53。
第一行的Server ,表示咱們本次DNS解析所使用的DNS服務器名稱; 第二行的Address ,表示咱們鏈接到的DNS 服務器的具體IP地址和端口。
介紹完了nslookup輸出中的上半部分,咱們再來看看重頭戲,nslookup輸出中的下半部分,也就是「域名解析信息」:
Non-authoritative answer: www.baidu.com canonical name = www.a.shifen.com. Name: www.a.shifen.com Address: 61.135.169.121 Name: www.a.shifen.com Address: 61.135.169.125
首先,映入眼簾的即是「Non-authoritative answer」,若是你對DNS協議瞭解的比較全面的話,你應該知道,這表示返回的結果是非權威的。
而canonical name,就是咱們常說的CNAME,也就是別名。因此咱們能夠看到,www.baidu.com 背後的別名是 www.a.shifen.com。
再下面的內容,則表示真正的解析結果,也就是www.baidu.com 所對應的兩個IP地址。
其實,nslookup的能力遠不止這些,咱們還能夠經過nslookup來查詢某個域名的SOA、A記錄、MX等,好比:
好了,咱們已經把nslookup的最經常使用用法介紹完畢了,更多的知識有待你們本身來學習和研究。
好,咱們進入第3個命令,即dig命令,不知道小夥伴們是否用過這個命令。
相比nslookup來講,dig命令算是比較冷門的命令,可是它真的很是有用,咱們來一塊兒看看。
dig,實際上是一個縮寫,即Domain Information Groper。
一些專業的DNS管理員在追查DNS問題時,都樂於使用dig命令。
最基本的dig用法是這樣的:
從上面這個例子中,咱們能夠看到,dig命令的基本語法格式是這樣子的:$ dig @dnsserver name querytype。
第一個參數,用來指定上聯DNS服務器的地址 第二個參數,用來指定要查詢的域名 第三個參數,則用來指定查詢類型。
其實,dig就是這麼簡單。
dig很是著名的一個查詢選項是 +trace,當使用這個查詢選項後,dig 會從根域查詢一直跟蹤直到查詢到最終結果,並將整個過程信息輸出出來。
其餘的選項能夠忘記,但+trace這個選項可必定要記住,在追查DNS解析問題時,高手都會使用這個選項的。
你們能夠在本身的Linux系統中體會一下,就像這個樣子:dig +trace roclinux.cn
除了+trace以外, 還有+short選項也很實用,它可讓dig輸出最精簡的CNAME信息和A記錄。
[roc@roclinux ~]$ dig +short www.baidu.com www.a.shifen.com. 112.80.248.74 112.80.248.73
在編寫Shell腳本時,經常會用到+short選項的。
若是你的電腦上有Linux系統,那麼直接輸入man netstat ,就能夠看到netstat的幫助信息了。
man對於netstat的解釋很是言簡意賅,只有一句簡短地描述:「netstat – Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships」。
中文意思是:netstat能夠用來顯示網絡鏈接、路由表、接口統計、無效鏈接和組播成員信息。
從這段簡短的描述中,咱們能夠看出,netstat有五大做用: - 顯示網絡鏈接信息 - 顯示路由信息 - 顯示接口統計信息 - 顯示無效鏈接信息 - 顯示組播成員信息。
我相信,你們或多或少都用過netstat,可是,我要告訴你們一個不太好的消息,那就是netstat已經被淘汰了...
若是你仔細閱讀man netstat的內容,就會發現這樣一句話:
"This program is obsolete."
原來netstat 已是明日黃花了,官方已經再也不更新了。它已經被ss命令和ip命令所取代,或許在不久的未來,在Linux發行版中就見不到netstat的身影了。
因此,若是還有人在用netstat,建議趕快去學習ss和ip命令吧。
我爲你們梳理了一張圖,展現了netstat被淘汰後的替代方案:
下面,咱們就趕忙進入ss命令。
ss是Socket Statistics的縮寫。
顧名思義,ss命令能夠用來獲取socket統計信息,它能夠顯示和netstat相似的內 容。但ss的優點在於它可以顯示更多更詳細的有關網絡鏈接狀態的信息,並且比 netstat更快速、更高效。
netstat爲何會被淘汰呢?
當服務器的socket鏈接數量變得很是大時,不管是使用netstat命令仍是直接讀取/proc/net/tcp文件,執行速度都會很是慢。
當服務器維持的鏈接達到上萬個的時候,使用netstat就等於浪費生命,而選用ss纔是明智的選擇。
天下武功惟快不破。ss快的祕訣在於,它利用到了TCP協議棧中的tcp_diag模塊。
tcp_diag是一個用於分析統計的模塊,能夠得到Linux內核中的第一手信息,這就確保了ss的快捷高效。
爲了讓你更堅定地和netstat說再見,咱們再列舉一些測試數據,以證實ss的快速絕非浪得虛名。
假如服務器維持着3萬個socket鏈接,而此時系統管理員須要計算當前服務器的總鏈接數,則可使用下面3種方法,不一樣方法的耗時有着明顯差別:netstat -at | wc 耗時 15.60 秒 ss -atr | wc 耗時 5.40 秒(未利用tcp_diag) ss -atr | wc耗時 0.47 秒(利用tcp_diag)。
能夠看到,利用了tcp_diag模塊特性的ss命令,真的是飛通常的感受。
下面,我就爲你們介紹幾個ss的最經常使用方法:
場景一:我想查看當前服務器的網絡鏈接統計 $ ss –s
場景二:我想查看全部打開的網絡端口 $ ss –l
場景三:我想查看這臺服務器上全部的socket鏈接 # ss –a
咱們接下來的是ip,它既不是IP地址,也不是知識產權,而是Linux系統iproute2軟件包中的ip命令,一個用來管理網絡設備和路由的強大命令。
假如我想展現一臺服務器的網絡接口信息,那就這樣: `# ip addr show;
而爲網絡接口添加一個IP 地址,方法是這樣的:# ip addr add 192.168.1.111/24 dev p1p2;
針對一個網絡接口刪除其IP 地址,這樣:ip addr del 192.168.1.111/24 dev p1p2;
禁止和激活網卡接口,也很簡單: ip link set p1p2 down ip link set p1p2 up;
查看路由表的方法是: ip route show;
能夠看到,ip命令是一個純粹的管理類命令,我回頭會整理一張關於ip的速查表,分享在」Linux大棚「公衆號和微博中,便於你們查閱。
tcpdump就好像一個神探,它有着夜視的絕技,在毫無光亮的環境中,仍然能夠看到全部的東西。
咱們能夠用通俗、形象、學術的表達方式來全方位地描述tcpdump :
通俗地說,tcpdump是一個抓包工具,用於抓取互聯網上傳輸的數據包。
形象地說,tcpdump就比如是國家海關,駐紮在出入境的咽喉要道,凡是 要入境和出境的集裝箱,海關人員總要打開箱子,看看裏面都裝了些啥。
學術地說,tcpdump是一種嗅探器(sniffer ),利用以太網的特性,經過 將網卡適配器(NIC )置於混雜模式(promiscuous )來獲取傳輸在網絡中 的信息包。
開門見山,咱們開始抓人生中的第一個包:
[root@roclinux ~]# tcpdump -i eth0 -nn -X 'port 53' –c1。
咱們來一塊兒解讀上面這條命令:
-i 選項:即interface,用來指定網絡接口,也就是要告訴tcpdump但願它去監聽哪一塊網卡,這在咱們的服務器有多塊網卡時是頗有必要的。
-nn選項:意思是當tcpdump遇到協議號或端口號時,不要將這些數字轉換成對應的協議名稱或端口名稱。好比,衆所周知21號端口是FTP端口,咱們但願顯示「 21」,而非「 FTP」。
-X選項:告訴tcpdump命令,須要把協議頭和包內容都原本來本地顯示出來。 tcpdump會同時以16進制和ASCII的形式顯示,這在進行協議分析時是絕對的利器。
port 53:這是告訴 tcpdump 要有選擇地展現所抓到的包。本例中,咱們只關心源端口或目的端口是53的數據包,其餘的數據包就不要再顯示出來了。
-c 選項:是Count的含義,這個選項用來設置咱們但願 tcpdump 幫咱們抓幾個包。我設置的是1,因此tcpdump只會抓一個包就收手,不會幫我再多抓哪怕一個包。
好了,你們都已經學會抓包了,而在實際運維工做中,咱們須要將抓到的包保存起來,而後再對抓到的包逐一進行分析。
因此,咱們就要掌握「如何保存」和「如何讀取」網絡數據包的技能。下面,咱們就來一塊兒學習。
作過網絡流量分析的同窗,或許都有一個共同的需求,那就是都要作「流量保存」和「流量回放」,這就剛好對應到了的-w選項和-r選項。
流量保存就是把抓到的網絡包存儲到磁盤上,保存下來,爲之後使用。
流量回放就是把歷史上的某一時間段的流量,從新模擬回放出來,用於流量分析。-w選項:將流量保存到文件中:
經過上面的例子能夠看到,經過-w 選項將流量都存儲在了flowdata文件中了。
若是你們用less命令查看flowdata這個文件的話,會發現全是亂碼。
原來,tcpdump的-w方式是把 raw packets(原始網絡包)直接存儲到文件中的,也就是 存儲的都是結構體數據,而非咱們在屏幕上所看到的文本格式的數據,所以你們是沒法直接經過less命令查看的。
那怎麼查看呢?你們想必也想到了,那就是用-r選項。
其實上面的命令就是在不知不覺中進行了「流量回放」,你會發現曾經被抓的網絡包,都按照歷史順序進行了回放,是否是有種坐上了「時光機」的感受。
前面咱們都是圍繞tcpdump 的選項來介紹的,下面,咱們會把目光轉向「過濾表達式」,讓你們可以在抓包過程當中「去其糟粕,取其精華」。
若是你但願本身研究「過濾表達式」,沒問題,我會告訴你如何「入門」,方法就是: man pcap-filter。
你會發現,過濾表達式大致能夠分紅三種過濾條件,「類型」、「方向」和「協議」,這三種條件的搭配組合就構成了咱們的過濾表達式。
咱們來看實戰:
我只想抓UDP的包,不想被TCP的包打擾 [root@roclinux ~]# tcpdump -i eth0 -c 10 'udp';
舉這個例子,是爲了說明tcpdump具備根據網絡包的協議類型來進行過濾的能力, 咱們還能夠把udp改成ether 、ip 、ip6 、arp 、tcp 或rarp 等。
我想專門查看這個源機器和那個目的機器之間的網絡包,不想被其餘無關的網絡包所打擾,該怎麼作呢?
這個其實很簡單,也很直觀,只要設置src(source)和dst(destination)就行了。 並且很方便的是,tcpdump還支持使用and和or來進行搭配組合呢!
[root@roclinux ~]# tcpdump -i eth0 'dst 8.8.8.8'。
只想看到目的端口是53或80的網絡包,其餘端口的我不關注。
[root@roclinux ~]# tcpdump -i eth0 -c 3 'dst port 53 or dst port 80'。
看,咱們這裏用到了or這個關係符。
咱們能夠設置過濾類型,上面例子中咱們使用了port這個類型,就是來指定端口 的。固然,tcpdump還支持以下類型:安全
若是咱們沒有設置過濾類型,那麼默認是host 。
好了,咱們在這幾分鐘裏,爲你們介紹了tcpdump的抓包、存包、讀包、過濾包的各類實戰方法,相信你們已經掌握了。
而如何解讀包中的內容,你們能夠經過閱讀我書中的相應篇章來深刻學習。
命令nc,全名netcat ,中文叫做「網貓」 ,nc的man中提到:The nc (or netcat) utility is used for just about anything under the sun involving TCP or UDP.
這句話翻譯成中文就是:「nc工具能勝任全天下的跟TCP/UDP相關的一切操做。」
nc確實很能幹,它能夠打開TCP 連接、發送UDP 包、監聽TCP/UDP 端口、進行端口掃描,是網 絡世界裏的一隻既可愛又靠譜的網貓。
nc最經常使用的用法就是端口掃描,用nc能夠很方便的看到哪些端口處於監聽狀態。
咱們來實際實施一次端口掃描:
上面命令掃描本地20-23端口,發現22端口可以鏈接成功,也就是22號端口此時處於開放狀態。下面解釋該命令涉及的幾個選項:
-z 選項:一旦創建鏈接後立刻斷開,而不發送和接收任何數據。 -v 選項:打印詳細輸出信息。 -n 選項:直接使用IP 地址,而不使用域名服務器來查詢其域名。 -w 選項:設置鏈接的超時時間,單位爲秒。 -u 選項:使用UDP 創建鏈接。上面命令無此設置,則表示使用TCP 創建鏈接。
其實,nc還有一個實戰時的用法,那就是傳輸文件。 只需選擇一個端口就能夠在兩臺機器之 間進行文件傳輸,而不須要進行任何配置,即不像ftp和scp在登陸階段還須要驗證用戶名、密碼這樣的安全信息。
咱們來看一個實戰例子:
在服務器端,也就是文件的發送端,咱們啓動監聽端口,準備好文件,等待客戶端來接收: [roc@roclinux ~]$ nc -v -l 12345 < book_out.txt。
在客戶端,也就是文件的接收端,會使用以下命令來接收服務器端的數據,並重定向到文件中:
此時,再回到服務器端,能夠看到這樣的信息輸出:
這說明客戶端已經來取數據了。一旦數據傳輸完畢,鏈接會自動斷開。
看完這個例子,我再給你們舉一個逆向思惟的例子。
服務器端,也就是使用-l選項進行端口監聽的一端,不必定非要是文件的發送端, 徹底能夠反過來做爲文件的接收端。
[roc@roclinux ~]$ nc -v -l 12345 > book_in.txt。
此時的客戶端,則充當文件發送端的角色。
[root@roclinux ~]# nc -n 116.255.245.207 12345 < book_out.txt。
瞬間劇情反轉了,是否是頗有意思呢?
好了,nc的用法,咱們就先講到這裏,其實nc還有不少能夠把玩的功能,你們能夠繼續深刻研究。
說到「同步」,不得不提的是咱們的同步利器rsync,接下來就來講說我從這個工具中體會到的同步的藝術。
咱們常常這樣使用rsync : [userA@machineA ~]$ rsync main.c machineB:/home/userB。
下面我會介紹rsync的5條規則,你們一條一條來看:服務器
那,有同窗會問了,若是我就是想同步修改時間,該怎麼辦呢?
-t 選項讓修改時間也同步。
[userA@machineA ~]$ rsync -t main.c machineB:/home/userB。
1.使用-t選項後,rsync總會想着一件事,那就是將源文件的「 modified time」 同步到目標機器。
2.帶有-t選項的rsync,會變得更「聰明」,它會在同步前先對比兩邊文件的 時間戳和文件大小。若是時間戳和文件大小都徹底一致,那麼就認定兩邊 文件是同樣的,因而,對這個文件就不會發起同步動做了。
3.由於rsync 的「聰明」,因此也會反被聰明誤。若是目的端的文件的時間 戳、大小和源端徹底一致,可是內容恰巧不一致時,rsync 就發現不了了。 這就是傳說中的「坑」。
咱們在第一次使用rsync時,每每會遇到這樣的囧境: [userA@machineA ~]$ rsync mydir machineB:/home/userB skipping directory mydir。
若是你不額外告訴rsync你須要它幫你同步文件夾的話,它是不會主動承擔的,這 也正是rsync的懶惰之處。
因此,若是你真的想同步文件夾,那麼必定要加上-r 選項,即recursive (遞歸的、循環的),像這樣: [userA@machineA ~]$ rsync -r mydir machineB:/home/userB。
在運維工做中,使用軟連接文件,是常有的事兒。
若是咱們要同步一個軟連接文件,猜猜rsync會提示什麼?
眼見爲實,rsync又無情地拒絕了咱們。它一旦發現某個文件是軟連接,就會無視它。
那麼,解決方法是什麼呢?
咱們須要增長-l選項(字母L 的小寫)。 [userA@machineA ~]$ rsync -l softlink machineB:/home/userB
使用了-l選項後,rsync會徹底保持軟連接文件類型,原本來本地將軟連接文件復 制到目的端,而不會「follow link 」到指向的實體文件。
若是你恰恰就是想讓rsync 採起follow link的方式,那就用-L選項就能夠了。大夥能夠本身試試效果。
rsync實際上是一個很是複雜的命令,它有很是多的選項,也有很多「坑兒」。
曾經個人同事就出現過使用rsync把遠端的數據同步丟了的狀況。
因此,在用這個命令前,大夥必定要多多測試。
能和rsync比複雜的,當屬wget,這個命令的破壞力不如rsync,可是選項也是足夠的多。
wget 用英語來描述就是 the non-interactive network downloader,中文稱之爲非交互 的網絡下載器。
wget支持HTTP、 HTTPS 和 FTP 協議的下載,其中也包括經過HTTP代理的下載。 看起來好像支持的協議並很少,但其實這已經足夠了,一般咱們是不多使用除這 些協議以外的其餘協議來進行下載的。
咱們仍是按照慣例,把wget 的最簡單用法先介紹給你們。
首先試着用wget 工具來下載一張 圖片: [roc@roclinux ~]$ wget http://www.yunweibang.com/yunweibang.jpg
wget用起來看着很簡單的吧!
其實否則,咱們來講說wget的一個潛規則。
提到潛規則,咱們先來講一下有關配置文件的潛規則吧。
當你使用wget時,請務必查看/etc/wgetrc 文件和家目錄下的.wgetrc文件,先搞清楚裏面都設置了什麼,再來使用wget命令不遲。
由於這兩個文件會配置wget的一些默認行爲,這對你們使用wget可能會有比較大的影響。
舉一個實際的例子,你就會有所體會啦。
wget命令有一些選項能夠接受用逗號隔開的參數,好比 -X(大寫的 x)選項,它用來設定「不但願下載」的目錄列表。
你能夠用逗號把不但願下載的目錄一個一個列出來,好比「 wget -X wukong,bajie」,這樣 wget 內心就有數了,它知道wukong目錄和bajie目錄都是不用下載的。
若是這些目錄是你長期不但願下載的,那麼你徹底能夠在.wgetrc文件中設置「長期不但願下載」的目錄列表,格式是這樣的:exclude_directories=wukong,bajie
因而,你沒必要在wget命令上設置,就能夠實現「不下載」wukong和bajie目錄。
固然,若是某天你下載文件時,發現總有幾個目錄下載不下來,那麼你應該想到,有多是其餘人設置了.wgetrc 形成的。固然你還要再去/etc/wgetrc 文件中確認一下你的假設。
還有一個小技巧,也能夠避免這種誤會(別人設置了exclude_directories ,而你殊不知道),那就是在你使用wget時,這樣來寫: wget -r -X '' -X wukong,bajie ftp://localhost
使用-X''的目的就是去除.wgetrc和/etc/wgetrc的做用,而後再用-X wukong ,bajie設置,就能夠踏踏實實地保證不下載wukong和bajie目錄,而其餘目錄毫不會受影響。
接下來,咱們來重點介紹下wget下載目錄的一些技巧,由於對於初學的同窗來講,目錄下載估計會是你們的噩夢。
-r選項就是用於下載遠程的文件夾的,可是狀況並無想象得那麼簡單,對於ftp服務來說,假如你使用了下面的命令來下載文件夾的話: [roc@roclinux ~]$ wget -r ftp://my.test.server:/home/roc/img
那麼,實際在當前目錄下會生成my.test.server/home/roc/img這樣的多層級目錄結 構,可見直接使用-r選項,默認會建立「 域名和絕對路徑」組成的目錄結構。
雖然咱們將數據成功下載到本地了,但這或許並非咱們的初衷,至於更優雅的解決辦 法,咱們須要-nH來幫忙。 -nH 選項,即 --no-host-directories
經過上例咱們已經知道了在使用wget –r命令下載目錄時,默認會建立以域名my.test.server命名的文件夾。而使用-nH選項後就能夠避免這種默認行爲。
因此,當你用以下命令下載文件時,只會在當前目錄下建立home/roc/img目錄結構,而原來的my.test.server文件夾已經不見了。 $ wget -r -nH ftp://my.test.server:/home/roc/img
域名去掉了,但長長的目錄路徑仍然還在,若是我只想下載img單個文件夾,不但願摻雜着前面的路徑,該怎麼作呢?
咱們還須要--cut-dirs來幫忙。
這個選項很經常使用,它表示下載數據時,在本地建立目錄時,忽略前面多少層的目 錄結構。
咱們來看一個表格,相信你們就豁然開朗了:
從表中你們應該知道-nH和--cut-dirs兩個選項互相配合的效果了吧。
好了,wget咱們就先講到這裏,這個命令涉及到的選項和知識有不少,即便花一堂課的時間來說解也不足夠。
在《Linux大棚命令百篇》中,咱們寫了一個小的系列文章,總共4篇,來說解wget命令,有志於深刻wget的同窗,能夠閱讀這個系列文章,來更全面的掌握wget命令哈。
咱們的內容已通過半了,爲了節省時間,後面的命令,咱們更多的是介紹最基本用法和1-2個實戰難點。
想必你們也有些疲憊了,咱們先來介紹一個輕鬆簡單的命令吧,那就是uptime。
uptime命令,有兩大功能:一個是查看機器的開機時長,另外一個是查看CPU負載狀況。
下面來看看uptime命令的實際運行效果:
其含義解釋,我繪製了一個表格:
這時,或許會有同窗問了,什麼是系統平均負載
學術的說,系統平均負載,是指在特定時間間隔內運行隊列中的平均進程數。
首先討論單核CPU狀況下的系統平均負載。咱們嘗試用「坐大巴」的場景,來講明這個事情。
一個單核CPU能夠形象地比喻成一輛大巴車。
通常來講,大巴車的載客數是必定的,好比30人。當大巴車載客營業時,若是載客20人的話,這時乘客會感受車內很寬鬆;當載客30人的話,這時剛恰好,每個人都有座位坐,但已經讓人感受擁擠了。當繼續有乘客上車的話,就會有人站在車的過道上,讓人感受車內擁擠不堪。
那如何體現車的擁擠程度呢? 這就要用到平均負載這個量化指標了。
0.00表示車內一我的都沒有,這時車是空載。 1.00表示車內乘客每一個人都有座位坐,這時車是滿載。
若是你們理解了單核CPU的系統平均負載,那麼理解多核CPU的系統平均負載就會容易得多。
多核CPU,就好像咱們有多輛大巴車,承載能力和運力都成比例增長。咱們設服務器具備N個CPU 核,那麼負載值若是小於N,則認爲服務器仍然在可承受範圍內,不然,就是過載狀態啦。
free命令,是一個看似簡單,但其實有不少學問的命令。
最最經常使用的用法,固然就是直接輸入free啦,輸出內容則以KB爲單位:
若是想讓數字更可讀,你們每每會加上-m選項,讓輸出內容以MB爲單位展現:
從free的輸出內容中,能夠看出,這臺服務器擁有3GB內存容量,對於一臺入門 級服務器來講,已經不算小了。
有些同窗比較喜歡使用-g選項,讓輸出內容以GB爲單位顯示。這樣雖然能夠增 加可讀性,但卻存在不小的隱患:
首先,-g選項並不是是官方支持的選項,你會發如今 man free 時是看不到這 個選項的,因此不確認在全部的free版本中都支持。
最重要的是,-g選項會採用向下取整的方式顯示內存容量,就如本文給出 的例子,本來3031MB內存容量,換算後變爲2.96GB,最後會顯示成2GB, 這會在很大程度上誤導用戶。
就像下面這樣,原本服務器的內存總量是3GB,可是這裏卻顯示成了2GB,是不 是很坑人呢?
閱讀free命令的輸出,也是一門學問,我遇到過太多的小夥伴,並不理解free命令輸出的指標的含義,爲此,我畫了一張示意圖,但願能讓你們對free的輸出一目瞭然。
建議你們收藏這張圖,甚至能夠打印出來,放在辦公桌前。
好了,後面還有8個命令要介紹,關於free命令的更細節,之後有機會再給你們細緻介紹。
vmstat這個命令真的很是實用,相信全部從事Linux相關工做的同窗都使用過它。
vmstat,是一個Linux的性能監控工具,是Virtual Memory Statistics的縮寫。從這 個細節能夠看出,這個命令最初只是被設計用來展現虛擬內存狀態的,後來隨着 不斷地迭代和擴展,如今變成了一個強大的性能監控工具。
vmstat,最初是在1994年被開發出來的,其做者是美國揚斯敦州立大學的 Henry Ware。貌似Linux的牛人都很低調,網上沒有找到他更多的資料。
vmstat的最經常使用用法
vmstat最經常使用的方法是:
$ vmstat 輸出間隔秒數 輸出次數
從上面的例子能夠看出,咱們但願vmstat每隔1秒輸出一次系統狀態信息,共輸 出4次。
和free命令相似,我也爲你們準備了一張速查圖,讓你們能夠更快的掌握vmstat命令:
mpstat,全稱是 ultiprocessor statistics,正如它的名字同樣,它所擅長的技能正是 多處理器的統計工做。
讓咱們來看看它的常見用法: [roc@roclinux splan]$ mpstat -P ALL 1
有興趣的同窗,能夠本身執行如下這個命令,看看輸出的內容。
發現了麼,咱們使用了-P ALL這樣的選項和參數,其做用是展現出每個CPU核 的運行狀態。
咱們的這臺服務器總共有4個CPU核,mpstat清晰地展現出了綜合狀態,以及每 一個CPU核的運行狀態。
而命令中最後的參數1,則表示要求mpstat每隔1秒鐘,產出一組新的狀態數據。 若是你使用過vmstat的話,你會很熟悉這種用法。
若是咱們只想關注第1個CPU核(編號爲0)的話,應該怎麼辦呢?其實很簡單, 只須要把ALL改爲0,就能夠了。
若是說vmstat還有些同窗不知道的話,那麼top命令應該是你們最耳熟能詳的 Linux命令之一了吧。
下面咱們就來和你們聊聊top這個命令。節省時間,咱們直接進入正題。
top命令,是很是經常使用的Linux 性能監控工具,運行時,它會獨佔屏幕,並週期性 地更新,讓工程師們能夠快速瞭解服務器的運行狀態。
經過top ,咱們能夠了解到服務器的CPU 負載狀況、內存狀態、SWAP 使用情況, 以及詳盡的進程級運行狀態,可謂應有盡有。
咱們最常使用的場景,大概有如下幾個: - 找到是哪些淘氣的進程在大量消耗CPU 資源。 - 看看哪些進程消耗了寶貴的內存空間。 - 看看哪些進程佔用的CPU時間最多。
一圖勝千言,咱們仍是經過速查圖,來介紹top吧:
這就是top命令輸出後的樣子,分紅系統級信息和進程級信息。
在書中,咱們針對top有五個篇章:
(1)top 命令庖丁解牛之一——入門 (2)top 命令庖丁解牛之二——列管理 (3)top 命令庖丁解牛之三——進程數據 (4)top 命令庖丁解牛之四——排序大法 (5)top 命令庖丁解牛之五——CPU 和內存
有興趣的同窗能夠去細細探究!
iostat,用來顯示 CPU 的統計信息以及整個系統、適配器、tty設備和硬盤的輸入/輸出信息。
首先,咱們來看看iostat執行起來的樣子:
能夠看到,iostat的輸出信息主要分爲三大部分。
第一部分:系統信息。包括了系統名稱、內核版本信息以及架構信息等。 第二部分:CPU信息閱讀過前面top系列文章的同窗,相信對這幾個指標項並不陌生。 第三部分:磁盤信息。這裏展現出了本臺服務器上各個存儲設備的I/O狀況,包括塊的讀寫量和讀寫速度等。
當咱們懷疑磁盤出現性能問題時,一般須要查看磁盤的各類信息。磁盤的工做狀 態如何?TPS 是多少?吞吐量有沒有問題?咱們須要經過命令把這些信息展現出 來:
上面的命令顯示了磁盤讀寫數據的狀況,命令中的選項和參數有必要和你們解釋 一下:
-d選項:表示只顯示磁盤的使用狀態,指定該選項後,iostat 將只顯示磁 盤信息而再也不顯示 CPU 信息。
-k選項:表示使用統KB做爲單位,好比 kB_read/s列的8.37表示的就 是 8.37KB/s。
「1 」參數:表示採樣時間,本例爲1 秒。 「3 」參數:表示採樣次數,本例爲3 次。
這幾個選項,應該算是使用最頻繁的選項啦。至於iostat中的各個指標的具體含義,你們能夠本身去探究。
下面爲你們介紹一位新朋友,它的名字叫做sar,它的腦子裏裝滿了服務器系統性能的信息。你只要和它搞好關係,之後想得到任何這方面的信息,就都不用發愁了!
咱們來看一下sar命令運行的樣子:
其中,sar 2 3表示每2秒輸出一次信息,共輸出3次實時信息,再外加一行彙總的 平均值,總共是4行信息。
sar命令支持多核CPU麼
哈哈,徹底沒問題的,sar命令擁有一個-P選項(大寫字母P ),就是專門用來展現 多核處理器性能指標的。
當使用sar命令而沒有設定-P選項時,sar會根據全部的CPU核信息給出一個彙總 報告。
當使用-P ALL時,sar命令就會針對每個CPU核都給出其具體性能信息,而後 再給出一個總的性能信息。
好比,我這裏有一個至強處理器的CPU,是八核的,看看-P選項的威力吧。
看到了吧,sar命令把每個CPU核都編上了號(從0到7),而且依次展現了它 們的各個性能指標。
除了cpu外,我還喜歡用sar來查看網絡流量,用法是這樣的:
若是使用EDEV關鍵字,那麼sar命令會針對網絡設備彙報其失敗狀況,例如:
好了,已經爲你們介紹了sar的最經常使用的幾種用法啦,你們能夠在本身的Linux服務器上使用起來了!
此次的主角,不是那款大名鼎鼎的圖像設計軟件Photoshop,而是Linux系統中的 進程狀態查看命令ps,即Process Status 。
若是你想查看你的服務器上有哪些進程,這些進程屬於哪些用戶,這些進程消耗 了多少CPU資源,這些進程佔據了多少內存資源,那麼就快來一塊兒學習ps命令吧。
下面咱們就從實戰出發,來學習ps的最經常使用用法。
ps aux即是咱們最經常使用的ps用法了。它能夠展現出系統中全部進程的狀態 信息,很是便於管理員進行全局查看。
那麼,aux到底表明什麼含義呢? a:顯示各終端上的全部進程。 u:會展現進程所屬用戶名。 x:對於沒有關聯到終端上的進程,也展現出來。
如今,咱們給出ps命令輸出列的解釋,便於你們閱讀和理解
至於ps如何以樹狀結構查看進程、如何控制輸出列、如何查看線程等技巧,能夠經過讀書來學習。
lsof,即list open files,能夠用來查看進程打開的文件、目錄和套接字等一系列信息。
lsof 是Linux系統管理員常用的工具之一,建議你們使用root帳戶運行該命令, 否則的話,可能會有很多信息沒法顯示出來。
lsof能夠經過文件名來定位打開該文件的進程,方法是執行lsof filename,這樣,就能夠找到究竟是誰在打開這個文件啦。
既然能夠經過文件名定位進程,那麼同理,文件描述符也應該是能夠的纔對。比 如咱們想找出全部打開標準錯誤輸出的進程: [root@roclinux ~]# lsof -d 3
工做中,還常常有這樣的需求,那就是經過PID 查找打開的文件。 [roc@roclinux ~]$ sudo lsof -p 5619
若是想查找用戶getsmartoffer在系統中都打開了哪些文件,咱們可使用-u選項來實現: [roc@roclinux ~]# sudo lsof -u getsmartoffer
除了查找文件以外,lsof還能夠查看程序佔用着哪些端口: [root@roclinux ~]# lsof -i:22
上面的例子,能夠查看端口22上都運行着哪些程序。
在書中,咱們爲你們準備了三個運維懸案,都是靠lsof來解決的: (1)文件刪除,但磁盤空間沒有釋放 (2)磁盤增加,但找不到幕後黑手 (3)端口被無端佔用
你們若是有興趣,能夠繼續進階閱讀。
lsof的強大功能,不管是在文件方面、網絡方面,仍是在偵查懸案方面,它的表現都超出了你們的預期。
可是比較遺憾的是,lsof命令並非POSIX標準中規定的命令,因此若是深究的話,lsof命令在可移植性方面會稍微差一些。而常常拿來與lsof命令做比較的fuser命令,則屬於POSIX標準的命令集。
因此咱們在本講座的最後一篇文章中,和你們介紹一下fuser命令。
可能有人會問「POSIX」是什麼,咱們就在這裏小科普一下。
POSIX,是Portable Operating System Interface的縮寫,中文稱爲可移植操做系統接口。它是一種有關操做系統的行業標準。 POSIX標準的職責是確保程序在源代碼級別上的可移植性。
通俗地說,只要在程序開發過程當中使用的是POSIX標準規定的API和命令,那麼這個程序就應該能夠在任何其餘符合POSIX標準的操做系統上編譯和執行。
科普以後,你們應該可以理解lsof和fuser在可移植性方面的區別了吧!
fuser命令在功能上和lsof命令有不少類似之處,它能夠顯示出磁盤上的文件、目 錄,甚至網絡端口正在被什麼程序使用,並能夠展現出這些程序的詳細信息。
咱們先來看一個示例。
[root@roclinux ~]# fuser -v /home/roc
上述命令列出了全部正在打開/home/roc/這個目錄(不含目錄下的文件)的進程。
這和lsof功能是相似的,在端口方面,fuser也能夠實現相似lsof的功能:
好比,你想看看都有哪些程序佔用了本機的22端口,則能夠經過下面的命令來實現:
其實還有另外一種寫法,也是能夠的:
也就是說,上面的-n tcp22能夠簡寫爲22/tcp的形式。這裏的tcp是協議類型。fuser中的協議類型有file(默認)、tcp和udp三種。你能夠自由組合它們來查找你想要的信息。
最後的最後,咱們給你們一個對比圖,來展現lsof和fuser的異同所在:
若是你們有任何命令方面的問題,能夠經過個人新書《Linux大棚命令百篇》上下冊來了解和研究。
最後,歡迎你們關注「Linux大棚」公衆號,有技術問題或職業發展問題,歡迎你們找我交流:)微信