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指南