A. 緗戠粶鍛戒護澶у叏
緗戠粶鍛戒護鏄鎸囧湪璁$畻鏈虹綉緇滅幆澧冧笅浣跨敤鐨勫懡浠わ紝鍙浠ラ氳繃鍛戒護琛屾垨緇堢紿楀彛涓庣綉緇滆繘琛屼氦浜掑拰鎺у埗銆傜綉緇滃懡浠ゅ彲浠ュ府鍔╂垜浠蹇閫熷湴榪涜岀綉緇滈厤緗銆佹晠闅滄帓闄ゃ佺綉緇滅洃鎺х瓑鎿嶄綔銆傛湰鏂囧皢浠嬬粛涓浜涘父鐢ㄧ殑緗戠粶鍛戒護鍙婂叾浣跨敤鏂規硶銆
ping鍛戒護
ping鍛戒護鐢ㄤ簬嫻嬭瘯緗戠粶榪炴帴鏄鍚︽e父銆傚畠浼氬悜鎸囧畾鐨勪富鏈哄彂閫佷竴涓狪CMP鏁版嵁鍖咃紝騫剁瓑寰呰ヤ富鏈虹殑鍝嶅簲銆傚傛灉璇ヤ富鏈鴻兘澶熷搷搴旓紝鍒欒〃紺虹綉緇滆繛鎺ユe父銆備嬌鐢ㄦ柟娉曞備笅錛
```
ping[閫夐」]鐩鏍囦富鏈
```
鍏朵腑錛岄夐」鍙浠ユ槸錛
--c錛氭寚瀹氬彂閫佹暟鎹鍖呯殑嬈℃暟銆
--i錛氭寚瀹氬彂閫佹暟鎹鍖呯殑鏃墮棿闂撮殧銆
--t錛氬湪Windows緋葷粺涓嬶紝鎸囧畾鎸佺畫鍙戦佹暟鎹鍖呫
渚嬪傦紝鎴戜滑鍙浠ヤ嬌鐢ㄤ互涓嬪懡浠ゆ祴璇曚笌鐧懼害鐨勭綉緇滆繛鎺ワ細
```
ping-c4www..com
```
榪欎釜鍛戒護浼氬悜鐧懼害鍙戦4涓鏁版嵁鍖咃紝騫剁瓑寰呭搷搴斻傚傛灉緗戠粶榪炴帴姝e父錛屾垜浠浼氬緱鍒扮被浼間互涓嬬殑杈撳嚭錛
```
64bytesfrom220.181.38.148:icmp_seq=1ttl=56time=12.7ms
64bytesfrom220.181.38.148:icmp_seq=2ttl=56time=11.5ms
64bytesfrom220.181.38.148:icmp_seq=3ttl=56time=11.5ms
64bytesfrom220.181.38.148:icmp_seq=4ttl=56time=11.6ms
---www..compingstatistics---
4packetstransmitted,4received,0%packetloss,time3004ms
rttmin/avg/max/mdev=11.581/11.886/12.748/0.465ms
```
榪欒〃紺烘垜浠涓庣櫨搴︾殑緗戠粶榪炴帴姝e父銆
ifconfig/ipconfig鍛戒護
ifconfig鍛戒護鐢ㄤ簬鏄劇ず鍜岄厤緗緗戠粶鎺ュ彛鐨勪俊鎮錛屽寘鎷琁P鍦板潃銆佸瓙緗戞帺鐮併丮AC鍦板潃絳夈傚湪linux緋葷粺涓嬶紝浣跨敤ifconfig鍛戒護錛涘湪Windows緋葷粺涓嬶紝浣跨敤ipconfig鍛戒護銆備嬌鐢ㄦ柟娉曞備笅錛
```
ifconfig[閫夐」][緗戠粶鎺ュ彛]
ipconfig[閫夐」]
```
鍏朵腑錛岄夐」鍙浠ユ槸錛
--a錛氭樉紺烘墍鏈夌綉緇滄帴鍙g殑淇℃伅銆
--s錛氭樉紺烘憳瑕佷俊鎮銆
--u錛氭樉紺烘湭琚閰嶇疆鐨勭綉緇滄帴鍙c
渚嬪傦紝鍦↙inux緋葷粺涓嬶紝鎴戜滑鍙浠ヤ嬌鐢ㄤ互涓嬪懡浠ゆ煡鐪嬬綉緇滄帴鍙eth0鐨勪俊鎮錛
```
ifconfigeth0
```
榪欎釜鍛戒護浼氳緭鍑虹被浼間互涓嬬殑淇℃伅錛
```
eth0___inkencap:Ethernet_Waddr00:0c:29:1c:3c:7a
inetaddr:192.168.1.100_cast:192.168.1.255_ask:255.255.255.0
inet6addr:fe80::20c:29ff:fe1c:3c7a/64Scope:Link
UPBROADCASTRUNNINGMULTICAST_TU:1500_etric:1
RXpackets:1241errors:0dropped:0overruns:0frame:0
TXpackets:1047errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:107853(107.8KB)_Xbytes:147782(147.7KB)
```
榪欒〃紺篹th0鐨処P鍦板潃鏄192.168.1.100錛屽瓙緗戞帺鐮佹槸255.255.255.0錛孧AC鍦板潃鏄00:0c:29:1c:3c:7a銆
netstat鍛戒護
netstat鍛戒護鐢ㄤ簬鏄劇ず緗戠粶榪炴帴銆佽礬鐢辮〃銆佺綉緇滄帴鍙g瓑淇℃伅銆傚畠鍙浠ュ府鍔╂垜浠鐩戞帶緗戠粶榪炴帴銆佹帓闄ょ綉緇滄晠闅滅瓑銆備嬌鐢ㄦ柟娉曞備笅錛
```
netstat[閫夐」]
```
鍏朵腑錛岄夐」鍙浠ユ槸錛
--a錛氭樉紺烘墍鏈夎繛鎺ュ拰鐩戝惉絝鍙c
--n錛氫互鏁板瓧褰㈠紡鏄劇ずIP鍦板潃鍜岀鍙e彿銆
--t錛氭樉紺篢CP榪炴帴銆
--u錛氭樉紺篣DP榪炴帴銆
渚嬪傦紝鎴戜滑鍙浠ヤ嬌鐢ㄤ互涓嬪懡浠ゆ樉紺烘墍鏈塗CP榪炴帴錛
```
netstat-atn
```
榪欎釜鍛戒護浼氳緭鍑虹被浼間互涓嬬殑淇℃伅錛
```
ActiveInternetconnections(serversandestablished)
ProtoRecv-QSend-QLocalAddress_____ForeignAddress____State
tcp___?0__?0127.0.0.1:3306____?0.0.0.0:*_______LISTEN
tcp___?0__?0192.168.1.100:22___?192.168.1.101:49858__ESTABLISHED
tcp___?0__?0192.168.1.100:22___?192.168.1.101:49857__ESTABLISHED
```
榪欒〃紺烘垜浠鐨勮$畻鏈哄湪鏈鍦扮洃鍚3306絝鍙o紝鍚屾椂涓192.168.1.101寤虹珛浜嗕袱涓猄SH榪炴帴銆
traceroute/tracert鍛戒護
traceroute/tracert鍛戒護鐢ㄤ簬璺熻釜鏁版嵁鍖呭湪緗戠粶涓鐨勮礬寰勩傚畠浼氬悜鐩鏍囦富鏈哄彂閫佷竴緋誨垪鏁版嵁鍖咃紝騫惰板綍姣忎釜鏁版嵁鍖呯粡榪囩殑璺鐢卞櫒銆備嬌鐢ㄦ柟娉曞備笅錛
```
traceroute[閫夐」]鐩鏍囦富鏈
tracert[閫夐」]鐩鏍囦富鏈
```
鍏朵腑錛岄夐」鍙浠ユ槸錛
--m錛氭寚瀹氭渶澶ц煩鏁般
--q錛氭寚瀹氭瘡涓璺崇偣鍙戦佹暟鎹鍖呯殑鏁伴噺銆
--w錛氭寚瀹氳秴鏃舵椂闂淬
渚嬪傦紝鎴戜滑鍙浠ヤ嬌鐢ㄤ互涓嬪懡浠よ窡韙鍒扮櫨搴︾殑璺寰勶細
```
traceroutewww..com
```
榪欎釜鍛戒護浼氳緭鍑虹被浼間互涓嬬殑淇℃伅錛
```
traceroutetowww..com(220.181.38.148),30hopsmax,60bytepackets
1?192.168.1.1(192.168.1.1)?1.452ms?1.177ms?1.214ms
2?218.17.157.1(218.17.157.1)?7.470ms?7.466ms?7.454ms
3?218.17.157.129(218.17.157.129)?7.441ms?7.413ms?7.400ms
4?218.17.158.29(218.17.158.29)?7.381ms?7.358ms?7.350ms
5?218.17.158.10(218.17.158.10)?7.334ms?7.324ms?7.310ms
6?202.97.94.145(202.97.94.145)?7.294ms?7.282ms?7.270ms
7?202.97.94.205(202.97.94.205)?7.247ms?7.236ms?7.223ms
8?202.97.33.149(202.97.33.149)?7.214ms?7.202ms?7.190ms
9?202.97.34.130(202.97.34.130)?7.177ms?7.165ms?7.152ms
10?202.97.94.34(202.97.94.34)?7.140ms?7.127ms?7.114ms
11?202.97.94.38(202.97.94.38)?7.099ms?7.086ms?7.074ms
12?***
13?220.181.38.148(220.181.38.148)?11.543ms?11.531ms?11.518ms
```
榪欒〃紺烘暟鎹鍖呬粠鏈鍦拌礬鐢卞櫒鍑哄彂錛岀粡榪囧氫釜璺鐢卞櫒錛屾渶緇堝埌杈句簡鐧懼害鐨勬湇鍔″櫒銆
ssh鍛戒護
ssh鍛戒護鐢ㄤ簬榪滅▼鐧誨綍鍒板彟涓鍙拌$畻鏈恆傚畠鍙浠ュ府鍔╂垜浠鍦ㄤ笉鍚屽湴鐐逛箣闂磋繘琛屾枃浠朵紶杈撱佽繙紼嬫搷浣滅瓑銆備嬌鐢ㄦ柟娉曞備笅錛
```
ssh[閫夐」
B. Linux下的並行神器——parallel
GNU Parallel的輸入源支持文件、命令行和標准輸入(stdin或pipe)。
當然,若不想像上面那樣進行組合,可使用 --xapply 參數從每一個源獲取一個參數(或文件一行),這個參數有些類似R中的函數,具有廣播作用——如果其中一個輸入源的長度比較短,它的值會被重復。
GNU Parallel可以通過 --arg-sep 和 --arg-file-sep 指定分隔符替代 ::: 或 ::::,當這兩個符號被其它命令佔用的時候會特別有用。
GNU Parallel默認把一行做為一個參數:使用 \n 做為參數定界符。可以使用 -d 改變:
GNU Parallel支持通過 -E 參數指定一個值做為結束標志:
GNU Parallel使用 --no-run-if-empty 來跳過空行:
如果parallel之後沒有給定命令,那麼這些參數會被當做命令:
此外,命令還可以是一個腳本文件,一個二進制可執行文件或一個bash的函數(須用 export -f 導出函數)
GNU Parallel支持多種替換字元串,默認使用 {},使用 -I 改變替換字元串符號 {}。其最常見的字元串替換包括以下幾種: {.} ,去掉擴展名; {/} ,去掉路徑,只保留文件名; {//} ,只保留路徑; {/.} ,同時去掉路徑和擴展名; {#} ,輸出任務編號。同時對於每一個字元串替換都可以自己指定符號: -I 對應 {} ; --extensionreplace 替換 {.} ; --basenamereplace 替換 {/} ; --dirnamereplace 替換 {//} ; --basenameextensionreplace 替換 {/.} ; --seqreplace 替換 {#} 。
同時,如果有多個輸入源時,可以通過 {編號} 指定某一個輸入源的參數:
使用 --header 把每一行輸入中的第一個值做為參數名。
使用 --colsep 把文件中的行切分為列,做為輸入參數。
--xargs 會在一行中輸入盡可能多的參數(與參數字元串長度有關),通過 -s 可指定一行中參數的上限。
為了獲得更好的並發性,GNU Parallel會在文件讀取結束後再分發參數。
GNU Parallel 在讀取完最後一個參數之後,才開始第二個任務,此時會把所有的參數平均分配到4個任務(如果指定了4個任務)。
第一個任務與上面使用 --xargs 的例子一樣,但是第二個任務會被平均的分成4個任務,最終一共5個任務。(奇怪的是我的結果與官網教程的結果不一樣)
替換字元串可以是輸出字元的一部分,使用 -m 參數表示每個job不重復輸出「背景」(context), -X 則與 -m 相反,會重復輸出「背景文本」,具體通過下面幾個例子進行理解:
使用 -N 限制每行參數的個數,其中 -N0 表示一次只讀取一個參數,且不輸入這個參數(作為計數器來使用)。
如果命令行中包含特殊字元,就需要使用引號保護起來。
perl腳本 'print "@ARGV\n"' 與linux的 echo 的功能一樣。
使用GNU Parallel運行這條命令的時候,perl命令需要用引號包起來,也可以使用 -q 保護perl命令:
使用 --trim 去除參數兩頭的空格:
使用 --tag 以參數做為輸出前綴,使用 --tagstring 修改輸出前綴:
--dryrun 作用類似於echo:
--verbose 則在運行之前先列印命令:
一般來說,GNU Parallel 會延遲輸出,直到一組命令執行完成。使用 --ungroup ,可立刻列印輸出已完成部分。
使用 --ungroup 會很快,但會導致輸出錯亂,一個任務的行輸出可能會被另一個任務的輸出截斷。像上例所示,第二行輸出混合了兩個任務: '4-middle' '2-start'。使用 --linebuffer 避免這個問題(稍慢一點):
強制使輸出與參數保持順序 --keep-order/-k :
GNU Parallel可以把每一個任務的輸出保存到文件中,臨時文件默認保存在 /tmp 中,可以使用 --tmpdir改變(或者修改 $TMPDIR):
輸出文件可以有結構的保存 --results ,輸出文件不僅包含標准輸出(stdout)也會包含標准錯誤輸出(stderr):
在使用多個變數的時候會顯示很有用:
使用 --jobs/-j 指定並行任務數。
通過使用 --interactive 在一個任務執行之前讓用戶決定是否執行。
當job有大量的IO操作時,為避免 「驚群效應」 ,可使用 --delay 參數指定各個job開始的時間間隔。
若已知任務超過一定時間未反應則為失敗則可以通過 --timeout 指定等待時間避免無謂的等待。GNU parallel能計算所有任務運行時間的中位數,因此可以指定時間為中位數的倍數關系。
GNU parallel有多種方式可用來動態的顯示任務進度信息,如:
使用 --joblog 參數能夠生成各個任務的日誌文件:
通過 --resume-failed 參數可以重新運行失敗的任務; --retry-failed 的作用與 --resume-failed 類似,只是 --resume-failed 從命令行讀取失敗任務,而 --retry-failed 則是從日誌文件中讀取失敗任務:
GNU parallel支持在某一情況下(如第一個失敗或成功時,或者20%任務失敗時)終止任務,終止任務又有兩種類型,其一為立即終止(通過 --halt now 指定),殺死所有正在運行的任務並停止生成新的任務,其二為稍後終止(通過 --halt soon 指定),停止生成新任務並等待正在運行任務完成。
GNU parallel還支持在任務失敗後重試運行 --retries :
關於終止信號的高級用法參考 官方入門文檔 。
GNU parallel能夠在開始一個新的任務前檢查系統的負載情況防止過載(通過 --load 可指定負載),同時還能檢查系統是否使用了交換空間(swap)(通過 --noswap 限制使用swap)。
同時,對於某些佔用內存較多的程序,parallel會檢查內存只有內存滿足時才啟動任務(通過 --memfree 指定需要內存大小),而且在啟動任務後內存不夠50%時會殺掉最新開始的任務,直到這個任務完成再重新開始那些殺死的任務。
還可以通過 --nice 來指定任務的優先順序。
可使用 -S host 來進行遠程登陸:
parallel -S username@$SERVER1 echo running on ::: username@$SERVER1
GNU parallel 文件傳輸使用的是rsync。
更多遠程操作參見入門文檔。
--pipe 參數使得我們可以將輸入(stdin)分為多塊(block),然後分配給多個任務多個cpu以達到負載均衡,最後的結果順序與原始順序一致。使用 --block 參數可以指定每塊的大小,默認為1M。
如果不關心結果順序,只想要快速的得到結果,可使用 --round-robin 參數。沒有這個參數時每塊文件都會啟動一個命令,使用這個參數後會將這些文件塊分配給job數任務(通過 --jobs 進行指定)。若想分配更為均勻還可同時指定 --block 參數。
參考:
官方文檔
GNU Parallel指南