Linux后台開發工具箱-葵花寶典
一見 2016/11/4
目錄
2.10.3. 查看指定進程ID的CPU,以下幾種都可以(“-o”后跟結果輸出格式format)
10
2.10.5. 同時查看指定進程ID的內存百分比和CPU百分比
10
2.10.6. 查看指定進程ID的CPU百分比和虛擬內存(vsz單位為kb)
10
2.10.7. 查看指定進程ID的虛擬內存和物理內存(rss單位為kb)
10
4.16. screen、byobu和tmux分屏工具 17
4.20. dstat可取代vmstat/iostat/netstat/ifstat的工具
17
4.21. MultiTail類似tail的同時監控多個文檔工具
18
7.1. valgrind和qcachegrind內存分析工具 28
9.3. /proc/PID和/proc/PID/maps 33
12. process_monitor.sh進程監控重啟工具 42
13.2. 批量上傳文件工具:mooon_upload 44
前言
本文是個大雜燴,內容為日常點滴的日積月累,持續更新當中,可關注博客(https://blog.csdn.net/Aquester或http://aquester.blog.chinaunix.net),查看最新版本。文中的內容,可幫忙開發提升分析和定位各類問題,比如找出導致IO負載高的進程等,以及一些簡單的運維工作等。
腳本類工具
雙引號和單引號
單引號內的內容不會被展開,雙引號內的內容會被展開。實踐如下:
~> A=123 ~> B1="$A" ~> B2='$A' ~> echo $A 123 ~> echo $B1 123 ~> echo $B2 $A |
---|
但如果單引號外有雙引號,則規則同雙引號,如:
~> B3="'$A'" ~> echo $B3 '123' |
---|
取腳本完整文件路徑
返回是帶全路徑的文件路徑,包括完整的文件名,即使以相對目錄執行腳本,返回的目錄部分也是完整的目錄:
FILEPATH="$(readlink -f $0)" |
---|
取腳本所在目錄路徑:
BASEDIR="$(dirname $(readlink -f $0))" |
---|
環境變量和變量
在終端分別執行:
“MOOON_LOG_LEVEL=debug”和“export MOOON_LOG_LEVEL=debug” |
---|
上述兩者有何不同了?區別在於前者只對當前進程有效,而后者(環境變量)可以被子進程繼承,也就是對子進程也有作用。
sed命令-字符串文本操作
如需直接修改文件方式替換,只需sed后帶參數“-i”。
- 單引號替換(特殊字符需要使用反斜線”\”進行轉義)
sed 's/原字符串/替換字符串/' |
---|
- 雙引號替換(如要替換的包含了“/”,則可使用“|”做分隔符)
sed "s/原字符串包含'/替換字符串包含'/" |
---|
- 問號替換
sed 's?原字符串?替換字符串?' |
---|
- 同時多個替換
不同替換間使用分號分開。
sed和awk使用外部變量
x=MM sed 's/AB/'$x'/g' filename 或 sed 's/AB/'"$x"'/g' filename sed 's/'"$val"'//' filename awk '{ print "'$x'" }' filename a=2;b=3;awk -v A=$a -v B=$b 'BEGIN{printf("%d,%d\n",A,B);}' |
---|
awk給外部變量賦值
假設將值存在文件t中,文件t內容如下,只有一行:
a b c |
---|
需要將a、b和c分別賦給外部變量x、y和z,則腳本可寫成如下:
eval $(awk '{ printf("x=%s\ny=%s\nz=%s",$1,$2,$3); }' ./t) echo $x echo $y echo $z |
---|
請注意printf函數中的換行符\n是必須的,起關鍵作用的是eval命令,它在很多場景有特別的用處。
稍復雜點的示例,對一個表求記錄數和某字段匯總,將結果分別賦值給Shell變量a和b:
eval $(mysql -srN -h127.0.0.1 -P3306 -uroot -p'12345678' test -e"SELECT COUNT(1),SUM(f_money) FROM t_test where f_time>='2019-07-18 00:00:00' and f_time<='2019-07-18 23:59:59'" | awk '{printf("a=%s\nb=%s\n",$1,$2);}') echo $a echo $b |
---|
浮點計算
- 使用bc(scale指定小數點位數)
$ a=2;b=3;echo "scale=2; $a / $b" | bc .66 $ a=2;b=3;echo "scale=2; $a / $b" | bc -l .66 |
---|
- 使用awk
$ a=2;b=3;awk 'BEGIN{printf("%.2f\n","'$a'"/"'$b'");}' 0.67 |
---|
字符串操作
刪除前尾空格
line是一個前尾有空格的字符串:
line=" 123 " echo "A${line}B" line=`echo "$line" | xargs` echo "A${line}B" |
---|
大小寫轉換
參考來源(BASH官方):
https://www.gnu.org/software/bash/manual/bash.html |
---|
- 轉換為小寫(BASH-4.0開始支持,打開bash.html后搜索“,,”)
A="aBc" echo $A A="${A,,}" echo $A |
---|
- 轉換為大寫(BASH-4.0開始支持,打開bash.html后搜索“^^”)
A="aBc" echo $A A="${A^^}" echo $A |
---|
不區分大小寫比較
BASH可如下操作:
A1="ab" A2="Ab" shopt -s nocasematch [[ "$A1" = "$A2" ]];echo $? shopt -u nocasematch |
---|
注意,這里不能使用“test "$A1" = "$A2";”,而只能使用語法“[[ "$A1" = "$A2"
]];”。從BASH-4.0開始,也可采用如下語法:
A1="ab" A2="Ab" test "${A1,,}" = "${A2,,}";echo $? |
---|
下面這樣也可以:
A1="ab" A2="Ab" [[ "${A1,,}" = "${A2,,}" ]];echo $? |
---|
取字符串長度
~> str="abcdef" ~> strlen=${#str} ~> echo $strlen 6 |
---|
遍歷字符串的每一個字符
順序遍歷字符串的每一個字符(“${str:$i:1}”中的數字1表示取幾個字符):
~> str="abcdef" ~> strlen=${#str} ~> echo $strlen 6 ~> for ((i=0; i<$strlen; ++i)) do echo ${str:$i:1}; done a b c d e f |
---|
判斷字符串是否為數字
使用expr,判斷expr的返回值,返回值為0表示是數字:
str1="123abc" str2="123000" $(expr $str1 + 0 > /dev/null 2>&1) echo $? $(expr $str2 + 0 > /dev/null 2>&1) echo $? |
---|
grep應用
或關系
匹配結果包含“abc”或“xyz”的行:
ps aux|grep -E 'abc|xyz' |
---|
使用雙引號也可以(一般建議盡量用單引號,因為雙引號存在被Shell解釋的問題,一些字符需轉義):
ps aux|grep -E "abc|xyz" |
---|
如果使用“-e”則這樣書寫:
ps aux|grep -e "abc" -e "xyz" |
---|
對於“-e”,單引號也可以:
ps aux|grep -e 'abc' -e 'xyz' |
---|
下列這樣也可以:
ps aux|grep "abc\|xyz" |
---|
使用egrep也可以:
ps aux|egrep "abc|xyz" |
---|
使用fgrep也可以:
ps aux|fgrep -e"abc" -e"xyz" ps aux|fgrep -e "abc" -e "xyz" ps aux|fgrep -e 'abc' -e 'xyz' |
---|
或關系總結(其中“egrep”等同“grep -E”,而“fgrep”等同“grep -F”):
grep "PATTERN1\|PATTERN2" FILE grep -E "PATTERN1|PATTERN2" FILE grep -e PATTERN1 -e PATTERN2 FILE fgrep -e PATTERN1 -e PATTERN2 FILE egrep "PATTERN1|PATTERN2" FILE |
---|
與關系
匹配結果包含“abc”並且包含“xyz”的行:
ps aux|grep "abc.*xyz" |
---|
ps應用
查看指定進程名的進程ID
ps -C redis-server -o pid |
---|
查看指定進程名的進程ID和完整命令行
ps -C redis-server -o pid -o comm |
---|
查看指定進程ID的CPU,以下幾種都可以(“-o”后跟結果輸出格式format)
ps --pid=$PID -o %cpu ps -p $PID -o %cpu ps -p $PID -o pcpu ps -q $PID -o %CPU |
---|
如果不想結果中包含輸出頭(Header),則可加上“h”修飾,如:
ps h -p 18374 -o pcpu |
---|
查看指定進程ID的內存
ps h -p 18374 -o %mem ps h -p 18374 -o pmem |
---|
同時查看指定進程ID的內存百分比和CPU百分比
ps h -p 18374 -o pcpu,pmem ps h -p 18374 -o pcpu -o pmem |
---|
查看指定進程ID的CPU百分比和虛擬內存(vsz單位為kb)
ps h -p 18374 -o pcpu -o vsz ps h -p 18374 -o pcpu -o vsize |
---|
查看指定進程ID的虛擬內存和物理內存(rss單位為kb)
ps h -p 18374 -o vsz,rss ps h -p 18374 -o vsz -o rssize |
---|
awk應用
取得IP和端口號
node="127.0.0.1:2019" eval $(echo "$node" | awk -F[\ \:,\;\t]+ '{ printf("ip=%s\nport=%s\n",$1,$2); }') echo $ip echo $port |
---|
取指定網卡上的IP地址
ethX=eth1 echo $ethX ip=`netstat -ie|awk -F'[ :]+' 'BEGIN{ok=0;} {if (match($0, "'$ethX'")) ok=1; if ((1ok) && match($0,"inet")) { ok=0; if (7NF) printf("%s\n",$3); else printf("%s\n",$4); } }'` echo $ip |
---|
日志滾動工具logrotate
Linux系統自帶的日志滾動工具logrotate由兩部分組成:一是命令行工具logrotate,二是后台服務rsyslogd。
使用rsyslogd,只需簡單的配置即可實現日志滾動。rsyslogd的配置文件為/etc/logrotate.conf,但一般不建議直接修改logrotate.conf,而是在目錄/etc/logrotate.d下新增文件的方式。
logrotate.conf會include所有logrotate.d目錄下的文件,語法是一致的,區別是logrotate.conf定義了默認的配置,而logrotate.d目錄下為專有配置。
下列為redis的配置示例:
# cat /etc/logrotate.d/redis /usr/local/redis/log/redis-6379.log /usr/local/redis/log/redis-6380.log /usr/local/redis/log/redis-6381.log { rotate 2 minsize 100M nocompress missingok create 0664 redis redis notifempty } |
---|
常用配置項說明:
rotate | 指定日志文件備份數,如果值為0表示不備份 |
---|---|
minsize | 表示日志文件達到多大才滾動 |
nocompress | 表示是否壓縮備份的日志文件 |
missingok | 如果日志丟失,不報錯繼續滾動下一個日志 |
notifempty | 日志文件為空時,不進行輪轉,默認值為ifempty |
create | 指定創建新日志文件的屬性,logrotate是以root運行的,如果目標日志文件非root運行,則這個一定要指定好 |
設備類工具
查看網卡型號
lspci | grep -i ethernet |
---|
dmidecode查看所有硬件信息工具
lscpu查看cpu工具
lspci查看主板工具
使用示例:
lspci -vvv lspci -vvv -t |
---|
lsscsi查看SCSI卡工具
系統類工具
命令systemctl
下面只列出了systemctl的部分用法。
- 系統管理
systemctl poweroff # 關機 systemctl reboot # 重啟 systemctl rescue # 進入單用戶模式 systemd-analyze # 查看系統啟動時間 loginctl list-users # 列出當前登錄用戶 loginctl user-status root # 查看用戶root的狀態 |
---|
- 查看系統狀態
systemctl status |
---|
- 管理單元
如啟動MySQL(這要求在目錄/lib/systemd/system下存在文件mysql.service):
systemctl status mysql.service |
---|
- 查看單元依賴
比如查看crond的依賴:
systemctl list-dependencies crond.service |
---|
又比如查看sshd的依賴:
systemctl list-dependencies sshd.service |
---|
命令journalctl
在systemd出現之前,Linux系統及各應用的日志都是分別管理的,systemd開始統一管理了所有Unit的啟動日志,這樣可以只用一個journalctl命令,查看所有內核和應用的日志,下面只列出了journalctl命令的小部分用法。
- 查看日志
journalctl # 查看所有日志(包括內核和應用日志) journalctl -k # 僅查看內核日志 journalctl -k -o json # 以JSON格式輸出日志 journalctl -k -o json --no-pager # 不按頁輸出(一次性全輸出,默認按頁輸出) journalctl -b # 查看系統本次啟動日志,等效於“journalctl -b 0” journalctl -b -1 # 查看系統上一次啟動日志 journalctl --disk-usage # 查看日志占用的磁盤大小 journalctl |
---|
- 查看指定時間日志
journalctl --since "10 min ago" journalctl --since="2019-11-22 19:50:22" journalctl --since yesterday journalctl --since "2019-11-20" --until "2019-11-21 10:00" |
---|
- 查看指定進程日志
journalctl _PID=`pidof crond` |
---|
- 查看指定用戶日志
journalctl _UID=`id -r -u root` --since today |
---|
重啟服務
不同發行版的Linux,重啟服務可能有些區別,這里以CentOS為例重啟crontab服務:
- 方式一:
service crond restart |
---|
- 方式二:
systemctl restart crond |
---|
其中service為老的重啟服務方式,而systemctl是新的重啟服務方式。service是一個腳本,而systemctl是一個可執行程序。
sar系統綜合工具
全稱“System Activity
Reporter”,即系統活動情況報告,最為全面的系統性能分析工具之一,也可用來查看網絡流量。
vmstat系統級內存監測工具
$ vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 1397364 3553340 775800 22420964 0 0 0 41 0 0 6 10 84 0 0 |
---|
iostat系統級磁盤IO監測工具
$ iostat Linux 3.10.1-1-XXX-0041 (UN) 2018年12月12日 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 6.13 0.01 10.00 0.02 0.00 83.84 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sdb 0.11 0.11 3.66 3818251 131342429 sda 6.06 1.54 158.24 55370852 5672335360 dm-0 0.00 0.03 0.02 1126394 833860 dm-5 0.00 0.00 0.00 45657 5116 dm-6 0.00 0.00 0.00 45657 5116 dm-1 0.00 0.00 0.00 45658 5110 dm-2 0.00 0.00 0.00 45658 5116 dm-3 0.00 0.00 0.00 46478 5216 dm-4 0.00 0.00 0.00 43486 3369 dm-7 0.00 0.00 0.00 43269 3361 |
---|
參數“-m”指定刷新頻率,單位為秒。
-
查看tps(每秒I/O次數):iostat -d -m
2(單位:MB,刷新間隔2秒),iostat -d -k 2(單位:KB) -
查看擴展數據:iostat -x -m 2(刷新間隔2秒)
-
查看設備使用率和響應時間:iostat -d -x -k 2
3(刷新間隔2秒,一共循環3次)
iostat輸出指標說明:
指標 | 說明 |
---|---|
%util | 每秒用於I/O操作的時間百分比,100%表示飽和,80%表示有20%的磁盤空間時間,標示了磁盤繁忙程度。 |
tps | 每秒I/O次數 |
await | 平均每次設備I/O操作的等待時間(單位:毫秒) |
svctm | 平均每次設備I/O操作的服務時間(單位:毫秒),值大小和磁盤性能有關。如果值和await接近,表示幾乎無I/O等待。如果await遠大於svctm,表示I/O隊列等待過長。 |
avgrq-sz | 平均每次設備I/O操作的數據大小(扇區) |
avgqu-sz | 平均I/O隊列長度,值越小越好 |
wMB/s | 每秒寫入的M字節數 |
rMB/s | 每秒讀取的M字節數 |
r/s | 每秒完成的讀I/O設備次數 |
w/s | 每秒完成的寫I/O設備次數 |
rsec/s | 每秒讀扇區數 |
wsec/s | 每秒寫扇區數 |
rrqm/s | 每秒合並的讀I/O,VFS將請求發給FS時,FS會對讀取相同塊(Block)的請求進行合並。 |
wrqm/s | 每秒合並的寫I/O |
iotop進程級磁盤IO監測工具
top和htop
htop為top的加強版本。
定時查看CPU
mpstat -P ALL 1 mpstat -I SUM 1 |
---|
示例(每秒顯示一次):
mpstat -P ALL 1 |
---|
查看系統中斷
cat /proc/interrupts |
---|
查看網卡中斷
grep eth1 /proc/interrupts |awk '{print $NF}' |
---|
查看中斷親和性
cat /proc/irq/74/smp_affinity # 以中斷74為例 |
---|
lsof
全稱“List Open
Files”,可用來查看進程打開了哪些文件,也可用來查看一個文件被哪些進程打開了,或者一個端口是哪個進程打開的等。
- 查看端口被誰占用
lsof -i:port,如:lsof -i:80 |
---|
- 顯示開啟文件abc.txt的進程
lsof abc.txt |
---|
- 顯示abc進程現在打開的文件
lsof -c abc |
---|
- 顯示目錄下被進程開啟的文件
lsof +d /usr/local/ |
---|
- 顯示使用fd為4的進程
lsof -d 4 |
---|
- 以UID,列出打開的文件
lsof -u username |
---|
- 看進程號為12的進程打開了哪些文件
lsof -p 12 |
---|
- 反復執行,刷新頻率為2秒
lsof -i:10888 -r 2 |
---|
ls +r 死循環執行,直到沒有結果,如已沒有程序占用端口號10888。
fuser
和lsof有些類似的功能,可查看文件、文件系統或套接字被哪些進程打開了。使用示例:
- 查看持有端口2019的進程
fuser -v -n tcp 2019 |
---|
- 殺掉所有打開文件/tmp/test的進程
fuser -m -k /tmp/test fuser -m -k -i /tmp/test |
---|
- 查看文件/tmp/test被哪些進程打開了
fuser -um /tmp/test |
---|
free查看內存工具
screen、byobu和tmux分屏工具
dtach
用來模擬screen的detach的功能的小工具:http://dtach.sourceforge.net/。
slabtop查看內核slab緩存工具
dmesg檢測和控制內核環緩沖工具
dstat可取代vmstat/iostat/netstat/ifstat的工具
- 示例1:
$ dstat You did not select any stats, using -cdngy by default. ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- usr sys idl wai hiq siq| read writ| recv send| in out | int csw 4 6 89 0 0 0| 746B 118k| 0 0 | 0 18B| 850 5461 8 9 82 0 0 0| 0 92k| 111k 71k| 0 0 |6888 15k 17 39 44 0 0 0| 0 96k| 107k 62k| 0 0 |7392 19k 2 3 94 0 0 0| 0 484k| 124k 171k| 0 0 |6855 13k |
---|
- 示例2:
# dstat -l -m -r -c --top-io --top-mem --top-cpu ---load-avg--- ------memory-usage----- --io/total- ----total-cpu-usage---- ----most-expensive---- --most-expensive- -most-expensive- 1m 5m 15m | used buff cach free| read writ|usr sys idl wai hiq siq| i/o process | memory process | cpu process 0.14 0.14 0.14|2710M 407M 6067M 117G|0.01 3.34 | 0 0 100 0 0 0|process_mon 960k 639B|redis-server 412M|report_proxy 0.0 0.13 0.14 0.14|2710M 407M 6067M 117G| 0 0 | 0 0 100 0 0 0|redis-serve 13k 9360B|redis-server 412M|report_proxy 0.1 0.13 0.14 0.14|2710M 407M 6067M 117G| 0 0 | 0 0 99 0 0 0|process_mon2027k 1986B|redis-server 412M|report_proxy 0.0 0.13 0.14 0.14|2710M 407M 6067M 117G| 0 0 | 0 0 100 0 0 0|sap1002 30k 624B|redis-server 412M|report_proxy 0.1 0.13 0.14 0.14|2710M 407M 6067M 117G| 0 9.00 | 0 0 99 0 0 0|process_mon2024k 1986B|redis-server 412M|report_proxy 0.1 0.13 0.14 0.14|2715M 407M 6067M 117G| 0 28.0 | 0 1 99 0 0 0|redis-serve 38k 4339k|redis-server 412M|report_proxy 0.1 0.68 0.25 0.18|2723M 407M 6067M 117G| 0 5.00 | 1 1 98 0 0 0|crond 13M 180k|redis-server 412M|report_proxy 0.1 |
---|
MultiTail類似tail的同時監控多個文檔工具
Monitorix系統和網絡監控工具
collectl全能性能監控工具
可以交互式地運行或作為一個守護進程或同時二者兼備地運行,可替代ps、top、iotop和vmstat等,可以作為一個服務來監控遠程機或者整個服務器集群。可使用yum或apt-get安裝,官網:http://collectl.sourceforge.net/。
- 示例1:
collectl #<--------CPU--------><-----------Disks-----------><-----------Network----------> #cpu sys inter ctxsw KBRead Reads KBWrit Writes netKBi pkt-in netKBo pkt-out 37 37 382 188 0 0 27144 254 45 68 3 21 25 25 366 180 20 4 31280 296 0 1 0 0 25 25 368 183 0 0 31720 275 2 20 0 1 |
---|
- 示例2:
collectl -sjmf -oT # <-------Int--------><-----------Memory-----------><------NFS Totals------> #Time Cpu0 Cpu1 Cpu2 Cpu3 Free Buff Cach Inac Slab Map Reads Writes Meta Comm 08:36:52 1001 66 0 0 2G 201M 609M 363M 219M 106M 0 0 5 0 08:36:53 999 1657 0 0 2G 201M 1G 918M 252M 106M 0 12622 0 2 08:36:54 1001 7488 0 0 1G 201M 1G 1G 286M 106M 0 20147 0 2 |
---|
- 示例3:
collectl -sn --verbose -oT # NETWORK SUMMARY (/sec) # KBIn PktIn SizeIn MultI CmpI ErrIn KBOut PktOut SizeO CmpO ErrOut 08:46:35 3255 41000 81 0 0 0 112015 78837 1454 0 0 08:46:36 0 9 70 0 0 0 29 25 1174 0 0 08:46:37 0 2 70 0 0 0 0 2 134 0 0 |
---|
- 示例4:
collectl -sJ -oTm # Int Cpu0 Cpu1 Cpu2 Cpu3 Type Device(s) 08:52:32.002 225 0 4 0 0 IO-APIC-level ioc0 08:52:32.002 000 1000 0 0 0 IO-APIC-edge timer 08:52:32.002 014 0 0 18 0 IO-APIC-edge ide0 08:52:32.002 090 0 0 0 15461 IO-APIC-level eth1 |
---|
percona工具包
簡稱PT(Percona Toolkit),可用來監控MySQL、MongoDB等。
- 查詢程序執行聚合的GDB堆棧跟蹤,先進性堆棧跟蹤,然后將跟蹤信息匯總:
pt-pmp -p pid |
---|
- 格式化explain出來的執行計划按照tree方式輸出,方便閱讀:
pt-visual-explain |
---|
- 從log文件中讀取插敘語句,並用explain分析他們是如何利用索引,完成分析之后會生成一份關於索引沒有被查詢使用過的報告:
pt-index-usage |
---|
磁盤工具
fio-磁盤IOPS測試工具
磁盤IOPS測試工具。MAN手冊:https://linux.die.net/man/1/fio,源代碼:http://freshmeat.sourceforge.net/projects/fio/。
- 隨機寫IOPS(4K為單位)
fio -filename=/dev/sdb -direct=1 -iodepth 16 -thread -rw=randwrite -ioengine=libaio -bs=4k -size=2G -numjobs=1 -runtime=100 -group_reporting -name=test |
---|
- 隨機讀IOPS(4K為單位)
fio -filename=/dev/sdb -direct=1 -iodepth 16 -thread -rw=randread -ioengine=libaio -bs=4k -size=2G -numjobs=1 -runtime=100 -group_reporting -name=test |
---|
- 順序寫IOPS(4K為單位)
fio -filename=/dev/sdb -direct=1 -iodepth 16 -thread -rw=write -ioengine=libaio -bs=4k -size=2G -numjobs=1 -runtime=100 -group_reporting -name=test |
---|
- 順序讀IOPS(4K為單位)
fio -filename=/dev/sdb -direct=1 -iodepth 16 -thread -rw=read -ioengine=libaio -bs=4k -size=2G -numjobs=1 -runtime=100 -group_reporting -name=test |
---|
主要參數說明:
參數名 | 參數說明 |
---|---|
filename | 測試文件名稱(通常選擇需要測試盤的data目錄) |
direct | 直接操作磁盤,繞過系統Buffer |
rw | 取值: |
bs | 單次I/O操作的塊大小(假如bs值為4k,rw值為write,表示每次4k順序寫文件) |
rwmixwrite | 在混合讀寫的模式下寫占的百分比,如“--rwmixwrite=20”表示寫占20% |
size | 測試的文件大小 |
numjobs | 測試線程數 |
ioengine | 使用的I/O引擎,支持以下幾種: |
group_reporting | 指標顯示結果,匯總每個進程的信息 |
runtime | 測試時長(單位:秒) |
nrfiles | 進程生成的文件數 |
zero_buffers | 用0初始化系統Buffer |
lockmem | 限定多少內存用於測試,如:--lockmem=1g |
-
randwrite 測試隨機寫
-
randread 測試隨機讀
-
randrw 測試隨機讀寫
-
write 測試順序寫
-
read 測試順序讀
-
sync(基於read、write、fseek)
-
psync(基於pread、pwrite)
-
vsync(基於readv、writev)
-
libaio(Linux內核異步I/O)
-
posixaio(基於Posix標准的異步I/O:aoi_read、aoi_write)
-
solarisaio(基於Solaris原生異步I/O)
-
windowsaio(基於Windows原生異步I/O)
-
mmap(基於mmap、memcpy)
sysbench
下載地址:https://github.com/akopytov/sysbench/releases。
一個開源的、模塊化的、跨平台的多線程性能測試工具,可以用來進行CPU、內存、磁盤I/O、線程、數據庫的性能測試。目前支持的數據庫有MySQL、Oracle和PostgreSQL。
示例:測試fsync是否為實時fsync:
sysbench --test=fileio --file-fsync-freq=1 --file-num=1 --file-total-size=16384 --file-test-mode=rndwr prepare sysbench --test=fileio --file-fsync-freq=1 --file-num=1 --file-total-size=16384 --file-test-mode=rndwr run |
---|
運行時,如果遇到警告“Did you forget to run the prepare
step”,則表示需要先執行“prepare”。
Python腳本測試:
#!/usr/bin/python # time python fsync.py import os, sys, mmap # Open a file fd = os.open( "testfile", os.O_RDWR|os.O_CREAT|os.O_DIRECT ) m = mmap.mmap(-1, 512) for i in range (1,1000): os.lseek(fd,os.SEEK_SET,0) m[1] = "1" os.write(fd, m) os.fsync(fd) # Close opened file os.close( fd ) |
---|
sfdisk分區工具
示例:列出所有分區
# sfdisk -l |
---|
fdisk分區工具
示例:列出所有分區
# fdisk -l |
---|
cfdisk分區工具
具有互動式操作界面的磁盤分區工具,參數-P表示顯示分區表的內容,附加參數“s”會依照磁區的順序顯示相關信息。
parted分區工具
一個由GNU開發的功能強大的磁盤分區和分區大小調整工具。
gparted分區工具
parted的圖形化版本。
SCSI工具
-
dmesg |grep SCSI
-
lsscsi
RAID工具
-
dmesg |grep -i raid
-
查看軟RAID:cat /proc/mdstat
hdparm磁盤性能測試工具
測試磁盤緩存讀性能使用示例:hdparm -t /dev/sda(或)hdparm -Tt /dev/sda。
mount掛載磁盤工具
文件/etc/fstab的內容和mount輸出是一致的。
mkfs創建文件系統工具
掛載一塊磁盤之前,需要先創建好文件系統。
df查看磁盤容量工具
du統計目錄和文件大小工具
進程類工具
pwdx命令-查看工作目錄
根據進程ID,查看指定進程的當前工作目錄(注意不是程序文件所在目錄),格式:pwdx
pid,如pwdx 1。
pidof命令-查看進程ID
根據進程名,查看進程的ID,格式:pidof 進程名,如:pidof init。
nice和ionice優先級調整工具
nice是進程的CPU優先級查看和調整工具,ionice是進程的IO優先級查看和調整工具。
pstack查看調用棧工具
根據進程ID,查看指定進程調用棧的工具,格式:pstack pid。
查看可執行程序和共享庫工具
-
objdump
-
nm 經常用來查看共享庫是否包含了某個符號
-
ldd 查看依賴關系工具
-
strings 列出符號
-
strip 刪除符號表工具
-
Readelf
ps命令
“ps”為“Process
Snapshot”的縮寫,使用頻繁的用來查看當前進程的快照工具,數據來源於虛擬文件“/proc”,如果輸出結果的用戶名太長,則會用數字型的用戶ID替代。
ps支持三種風格的命令行參數:
-
UNIX 必須以“-”打頭,可以分組
-
BSD 不能以“-”打頭,也可以分組
-
GNU 以兩個“-”打頭\
三種風格可以混合使用,但可能有沖突,三種風格有些名稱相同但含義不同。以查看系統中所有進程為例:
-
標准語法:ps -ef或ps -eF等
-
BSD語法:ps aux或ps ax
查看進程樹:
-
標准語法:ps -ejH
-
BSD語法:ps axjf
查看線程:
-
標准語法:ps -eLf
-
BSD語法:ps axms
查看root運行的所有進程:ps -U root -u root u。以指定格式查看:
-
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
-
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
-
ps -Ao pid,tt,user,fname,tmout,f,wchan
只顯示進程ID為42的進程名:ps -q 42 -o comm=。只syslogd的進程ID:ps -C syslogd -o
pid=。
“ps -ef”和“ps
-Af”相同,原因是“-e”和“-A”作用相同。如果不想顯示標題頭,指定“--no-heading”即可。
按CPU使用率排序
- 顯示CPU使用率最高的前5個進程:
ps -Ao pcpu,comm,pid,user,uid,tty --sort=-pcpu | head -n 6
說明:
-
-A 表示顯示所有進程
-
pcpu CPU使用率真
-
comm 進程名(不包含路徑)
-
pid 進程ID
-
user 用戶名
-
--sort 指定按什么排序
-
顯示CPU使用率最低的前5個進程:
ps -Ao pcpu,comm,pid,user,uid,tty --sort=pcpu | head -n 6
注意,這里是“-pcpu”,不是“pcpu”,前者按高到低排,后者從低到高排,順序剛好相反。“pcpu”可用“%cpu”替代,效果完全相同。
如果按物理內存排序,用“rss”替代“pcpu”,按虛擬內存排,用“vsz”替代“pcpu”即可。
按內存使用率排序
- 顯示物理內存占用最高的前5個進程:
ps -Ao rss,pcpu,comm,pid,user,uid,tty --sort=-rss| head -n 6
- 顯示物理內存占用最低的前5個進程:
ps -Ao rss,pcpu,comm,pid,user,uid,tty --sort=rss| head -n 6
pmap和查看進程內存映射
借助pmap,即可查看指定進程的查看進程的內存映像信息。示例:
[root@centos ~]# pmap -xp 2044 2334: /usr/local/redis/bin/redis-server 0.0.0.0:6380 Address Kbytes RSS Dirty Mode Mapping 0000000000400000 1556 696 0 r-x-- /usr/local/redis-5.0.3/bin/redis-server 0000000000785000 8 8 4 r---- /usr/local/redis-5.0.3/bin/redis-server 0000000000787000 24 24 24 rw--- /usr/local/redis-5.0.3/bin/redis-server 000000000078d000 2200 132 132 rw--- [ anon ] 000000000159b000 132 56 56 rw--- [ anon ] 00007f9ed36d4000 4 0 0 ----- [ anon ] 00007f9ed36d5000 8192 12 12 rw--- [ anon ] 00007f9ed3ed5000 4 0 0 ----- [ anon ] 00007f9ed3ed6000 8192 12 12 rw--- [ anon ] 00007f9ed46d6000 4 0 0 ----- [ anon ] 00007f9ed46d7000 8192 12 12 rw--- [ anon ] 00007f9ed4ed7000 103588 0 0 r---- /usr/lib/locale/locale-archive 00007f9edb400000 8192 868 868 rw--- [ anon ] 00007f9edbcd3000 1756 520 0 r-x-- /usr/lib64/libc-2.17.so 00007f9edbe8a000 2044 0 0 ----- /usr/lib64/libc-2.17.so 00007f9edc089000 16 16 16 r---- /usr/lib64/libc-2.17.so 00007f9edc08d000 8 8 8 rw--- /usr/lib64/libc-2.17.so 00007f9edc08f000 20 12 12 rw--- [ anon ] 00007f9edc094000 92 68 0 r-x-- /usr/lib64/libpthread-2.17.so 00007f9edc0ab000 2044 0 0 ----- /usr/lib64/libpthread-2.17.so 00007f9edc2aa000 4 4 4 r---- /usr/lib64/libpthread-2.17.so 00007f9edc2ab000 4 4 4 rw--- /usr/lib64/libpthread-2.17.so 00007f9edc2ac000 16 4 4 rw--- [ anon ] 00007f9edc2b0000 28 4 0 r-x-- /usr/lib64/librt-2.17.so 00007f9edc2b7000 2044 0 0 ----- /usr/lib64/librt-2.17.so 00007f9edc4b6000 4 4 4 r---- /usr/lib64/librt-2.17.so 00007f9edc4b7000 4 4 4 rw--- /usr/lib64/librt-2.17.so 00007f9edc4b8000 8 4 0 r-x-- /usr/lib64/libdl-2.17.so 00007f9edc4ba000 2048 0 0 ----- /usr/lib64/libdl-2.17.so 00007f9edc6ba000 4 4 4 r---- /usr/lib64/libdl-2.17.so 00007f9edc6bb000 4 4 4 rw--- /usr/lib64/libdl-2.17.so 00007f9edc6bc000 1024 8 0 r-x-- /usr/lib64/libm-2.17.so 00007f9edc7bc000 2048 0 0 ----- /usr/lib64/libm-2.17.so 00007f9edc9bc000 4 4 4 r---- /usr/lib64/libm-2.17.so 00007f9edc9bd000 4 4 4 rw--- /usr/lib64/libm-2.17.so 00007f9edc9be000 128 36 0 r-x-- /usr/lib64/ld-2.17.so 00007f9edcbcf000 20 20 20 rw--- [ anon ] 00007f9edcbdc000 4 4 4 rw--- [ anon ] 00007f9edcbdd000 4 4 4 r---- /usr/lib64/ld-2.17.so 00007f9edcbde000 4 4 4 rw--- /usr/lib64/ld-2.17.so 00007f9edcbdf000 4 4 4 rw--- [ anon ] 00007fffc7af3000 132 16 16 rw--- [ stack ] 00007fffc7b1f000 8 4 0 r-x-- [ anon ] ffffffffff600000 4 0 0 r-x-- [ anon ] ---------------- ------- ------- ------- total kB 153824 2588 1244 |
---|
除了使用pmap,還可如下方式:
[root@centos ~]# cat /proc/2334/maps 00400000-00585000 r-xp 00000000 fd:01 287120 /usr/local/redis-5.0.3/bin/redis-server 00785000-00787000 r--p 00185000 fd:01 287120 /usr/local/redis-5.0.3/bin/redis-server 00787000-0078d000 rw-p 00187000 fd:01 287120 /usr/local/redis-5.0.3/bin/redis-server 0078d000-009b3000 rw-p 00000000 00:00 0 0159b000-015bc000 rw-p 00000000 00:00 0 [heap] 7f9ed36d4000-7f9ed36d5000 ---p 00000000 00:00 0 7f9ed36d5000-7f9ed3ed5000 rw-p 00000000 00:00 0 [stack:2343] 7f9ed3ed5000-7f9ed3ed6000 ---p 00000000 00:00 0 7f9ed3ed6000-7f9ed46d6000 rw-p 00000000 00:00 0 [stack:2342] 7f9ed46d6000-7f9ed46d7000 ---p 00000000 00:00 0 7f9ed46d7000-7f9ed4ed7000 rw-p 00000000 00:00 0 [stack:2341] 7f9ed4ed7000-7f9edb400000 r--p 00000000 fd:01 125493 /usr/lib/locale/locale-archive 7f9edb400000-7f9edbc00000 rw-p 00000000 00:00 0 7f9edbcd3000-7f9edbe8a000 r-xp 00000000 fd:01 98905 /usr/lib64/libc-2.17.so 7f9edbe8a000-7f9edc089000 ---p 001b7000 fd:01 98905 /usr/lib64/libc-2.17.so 7f9edc089000-7f9edc08d000 r--p 001b6000 fd:01 98905 /usr/lib64/libc-2.17.so 7f9edc08d000-7f9edc08f000 rw-p 001ba000 fd:01 98905 /usr/lib64/libc-2.17.so 7f9edc08f000-7f9edc094000 rw-p 00000000 00:00 0 7f9edc094000-7f9edc0ab000 r-xp 00000000 fd:01 98931 /usr/lib64/libpthread-2.17.so 7f9edc0ab000-7f9edc2aa000 ---p 00017000 fd:01 98931 /usr/lib64/libpthread-2.17.so 7f9edc2aa000-7f9edc2ab000 r--p 00016000 fd:01 98931 /usr/lib64/libpthread-2.17.so 7f9edc2ab000-7f9edc2ac000 rw-p 00017000 fd:01 98931 /usr/lib64/libpthread-2.17.so 7f9edc2ac000-7f9edc2b0000 rw-p 00000000 00:00 0 7f9edc2b0000-7f9edc2b7000 r-xp 00000000 fd:01 98935 /usr/lib64/librt-2.17.so 7f9edc2b7000-7f9edc4b6000 ---p 00007000 fd:01 98935 /usr/lib64/librt-2.17.so 7f9edc4b6000-7f9edc4b7000 r--p 00006000 fd:01 98935 /usr/lib64/librt-2.17.so 7f9edc4b7000-7f9edc4b8000 rw-p 00007000 fd:01 98935 /usr/lib64/librt-2.17.so 7f9edc4b8000-7f9edc4ba000 r-xp 00000000 fd:01 98911 /usr/lib64/libdl-2.17.so 7f9edc4ba000-7f9edc6ba000 ---p 00002000 fd:01 98911 /usr/lib64/libdl-2.17.so 7f9edc6ba000-7f9edc6bb000 r--p 00002000 fd:01 98911 /usr/lib64/libdl-2.17.so 7f9edc6bb000-7f9edc6bc000 rw-p 00003000 fd:01 98911 /usr/lib64/libdl-2.17.so 7f9edc6bc000-7f9edc7bc000 r-xp 00000000 fd:01 98913 /usr/lib64/libm-2.17.so 7f9edc7bc000-7f9edc9bc000 ---p 00100000 fd:01 98913 /usr/lib64/libm-2.17.so 7f9edc9bc000-7f9edc9bd000 r--p 00100000 fd:01 98913 /usr/lib64/libm-2.17.so 7f9edc9bd000-7f9edc9be000 rw-p 00101000 fd:01 98913 /usr/lib64/libm-2.17.so 7f9edc9be000-7f9edc9de000 r-xp 00000000 fd:01 98898 /usr/lib64/ld-2.17.so 7f9edcbcf000-7f9edcbd4000 rw-p 00000000 00:00 0 7f9edcbdc000-7f9edcbdd000 rw-p 00000000 00:00 0 7f9edcbdd000-7f9edcbde000 r--p 0001f000 fd:01 98898 /usr/lib64/ld-2.17.so 7f9edcbde000-7f9edcbdf000 rw-p 00020000 fd:01 98898 /usr/lib64/ld-2.17.so 7f9edcbdf000-7f9edcbe0000 rw-p 00000000 00:00 0 7fffc7af3000-7fffc7b14000 rw-p 00000000 00:00 0 [stack] 7fffc7b1f000-7fffc7b21000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] |
---|
性能類工具
valgrind和qcachegrind內存分析工具
開源的內存分析和性能分析工具。qcachegrind是一個valgrind輔助工具,可視化方式查看valgrind性能分析結果。
perf性能分析工具
Linux自帶的功能強大的性能分析工具,可結合火焰圖。使用方式,如:perf top -p
pid。自帶了生成SVG格式的圖形化工具timechart,也可結合FlameGraph生成火焰圖。。
記錄進程一段時間性能統計信息:
perf record -p pid -g -e event -o logfile perf report -i logfile |
---|
壓力測試工具:ab、tsung、siege
網絡類工具
netstat和ss命令
ss是一個可以替代netstat的網絡連接查看工具(socket statistics)。
示例1:查看TCP監聽
netstat -lpnt |
---|
示例1:查看TCP連接
netstat -lpna |
---|
ifconfig和ip命令
ip是一個可以替代ifconfig和route等的網絡管理工具,為iproute2套件中的一員,而ifconfig是net-tools中已被廢棄使用的一個命令,許多年前就已經沒有維護了。
- 示例1:設置一個IP
ip addr add 192.168.31.13/24 dev eth1 |
---|
- 示例2:查看設置的IP是否生效
ip addr show eth1 |
---|
- 示例3:刪除IP
ip addr del 192.168.31.13/24 dev eth1 |
---|
- 示例4:查看路由表
ip route show |
---|
ifdown和ifup
ifdown和ifup實際是基於ifconfig的Shell腳本,可用ifdown禁用指定網卡,如“ifdown
eth1”,而ifup則相反,用於啟用指定網卡。
tcpdump網絡抓包工具
參數“-s”指定顯示多少字節的包內容,-x表示僅以十六進制輸出,-X表示同時以十六進制和文本方式輸出,-e表示輸出鏈接級別的頭,-w指定結果寫入文件。
- 顯示包的內容:
tcpdump -i eth1 -n -vv -x -e -s 600 # 僅二進制 tcpdump -i eth1 -n -vv -X -e -s 600 # 二進制和文本 |
---|
- 抓包保存到文件供Wireshark分析:
tcpdump -i eth1 -n -vv -X -e -s 600 -w x.cap |
---|
- 抓取192.168.31.1的80端口的包:
tcpdump -i eth1 host 192.168.31.1 and port 80 |
---|
- 抓取目標IP為192.168.31.1和目標端口為80端口的包:
tcpdump -i eth1 dst host 192.168.31.1 and dst port 80 |
---|
- 監聽指定網卡
tcpdump -i eth1 |
---|
- 監聽指定UDP端口
tcpdump udp port 10888 |
---|
- 監聽指定TCP端口
tcpdump tcp port 80 |
---|
- 監聽A和B或A和C間的通訊
tcpdump host A and \(B or C \) # tcpdump host 127.0.0.1 and \(127.0.0.1 or 110.240.110.18 \) |
---|
- 監聽A的所有通訊,但不包括A和B的
tcpdump ip A and not B |
---|
- 監聽A發出的所有包
tcpdump -i eth1 src host A |
---|
- 監聽所有發送到B的包
tcpdump -i eth1 dst host B |
---|
- 監聽A收到或發出的所有http包
tcpdump tcp port 80 and host A |
---|
- 列出tcpdump能夠監聽的網卡
tcpdump -D |
---|
- 監聽所有網卡,要求2.2或更高版本內核
tcpdump -i any |
---|
- 詳細顯示捕獲的信息
tcpdump -v |
---|
更詳細可以使用“tcpdump -vv”和“tcpdump -vvv”。
- 以十六進制和ASCII方式打印包,除了連接層頭
tcpdump -v -X |
---|
- 以十六進制和ASCII方式打印包,包括連接層頭
tcpdump -v -XX |
---|
- 限制捕獲100個包
tcpdump -c 100 |
---|
- 將記錄寫入文件
tcpdump -w filename.log |
---|
- 使用IP代替域名
tcpdump -n |
---|
- 捕獲每個包的100字節而不是默認的68字節
tcpdump -s 500 |
---|
如果要捕獲所有字節則為:tcpdump -s 0。
- 捕獲所有廣播或多播包
tcpdump -n "broadcast or multicast" |
---|
- 捕獲所有icmp和arp包
tcpdump -v "icmp or arp" |
---|
- 捕獲arp包
tcpdump -v arp |
---|
- 捕獲目標地址是192.168.0.1,端口是80或443的包
tcpdump -n "dst host 192.168.0.1 and (dst port 80 or dst port 443)" |
---|
- 捕獲目標端口號在1-1023間的UDP包
tcpdump -n udp dst portrange 1-1023 |
---|
- 捕獲目標端口號為23的包
tcpdump dst port 23 |
---|
- 捕獲目標網絡為192.168.1.0/24的包
tcpdump -n dst net 192.168.1.0/24 |
---|
- 捕獲源網絡為192.168.1.0/24的包
tcpdump -n src net 192.168.1.0/24 |
---|
ifstat網絡流量實時查看工具
$ ifstat #kernel Interface RX Pkts/Rate TX Pkts/Rate RX Data/Rate TX Data/Rate RX Errs/Drop TX Errs/Drop RX Over/Rate TX Coll/Rate lo 8546 0 8546 0 11845K 0 11845K 0 0 0 0 0 0 0 0 0 eth1 93020 0 41717 0 8867K 0 5969K 0 0 0 0 0 0 0 0 0 |
---|
iptraf實時IP局域網監控
iftop網絡帶寬監控
按對端IP查看網絡流量。
nethogs網絡帶寬監控
按進程查看網絡流量:https://github.com/raboof/nethogs/releases。
slurm查看網絡流量工具
Arpwatch以太網活動監控器
Suricata網絡安全監控
Nagios網絡/服務器監控
socat多功能的網絡工具
全稱“Socket CAT”,為netcat的加強版。
mtr網絡連通性判斷工具
集成了traceroute和ping。
查看網卡統計
ethtool -S eth1 |
---|
查看網卡RingBuffer大小
ethtool -g eth1 |
---|
sar查看網絡流量
sar -n DEV 1 # 流量信息 sar -n EDEV 1 # 錯誤信息 sar -u 2 5 # 每2秒報告CPU使用率,共顯示5行(次) sar -I 14 -o int14.file 2 10 每2秒報告14號中斷,共顯示10行(次),結果寫入文件int14.file sar -f /var/log/sa/sa16 顯示內存和網絡統計,結果寫入文件/var/log/sa/sa16 sar -A 顯示所有統計 |
---|
tcpcopy引流
可使用tcpcopy工具將線上環境的流量引入到測試環境中,以將機器10.24.110.21的5000端口流量引流到機器10.23.25.11的5000端口為例:
- 線上機器10.24.110.21
tcpcopy -x 4077-10.23.25.11:5000 -s 10.23.25.12 -c 192.168.100.x -n 1 |
---|
- 測試機器10.23.25.11
route add -net 192.168.100.0 netmask 255.255.255.0 gw 10.23.25.12 |
---|
- 輔助機器10.23.25.12
intercept -i eth1 -F tcp and src port 5000 |
---|
因為TCP連接是有回包的,所以需要輔助機器幫助接收回包,一般是直接丟棄掉。
/proc文件系統
有關/proc的內容很龐大,系統監控需要從這里讀取大量數據,這里逐步記錄一些常用到的。
/proc/meminfo
內存大小和使用信息。
/proc/cpuinfo
CPU個數和頻率等CPU信息。
/proc/PID和/proc/PID/maps
進程的各種信息,其中PID為進程ID,假設進程ID為2019,則路徑為“/proc/2019”。一個進程所創建和打開的文件描述符,全在/proc/PID/fd下,以Linux的init進程為例:
# ls /proc/1/fd 0 1 10 11 12 13 14 15 16 17 2 20 21 22 24 25 26 27 28 29 3 30 31 32 33 34 37 38 39 4 5 6 7 8 9 |
---|
包括進程的命令行參數等均可以這個目錄下得到,“cat
/proc/PID/maps”可查看進程的內存映射。
/proc/irq/
- /proc/irq/
該目錄下存放的是以IRQ號命名的目錄,如/proc/irq/40/表示中斷號為40的相關信息。
- /proc/irq/[irq_num]/smp_affinity
該文件存放的是CPU位掩碼(十六進制),修改該文件中的值可以改變CPU和某中斷的親和性。
- /proc/irq/[irq_num]/smp_affinity_list
該文件存放的是CPU列表(十進制),注意CPU核心個數用表示編號從0開始,如cpu0和cpu1等。
/proc/net
網絡相關的:
- /proc/net/dev
可用來統計網卡流量。
- /proc/net/sockstat SOCKET的各類狀態
/proc/sys/fs
文件系統相關:
-
/proc/sys/fs/file-max
-
/proc/sys/fs/file-nr
-
/proc/sys/fs/inode-nr
/proc/sys/net
網絡相關:
-
/proc/sys/net/core/somaxconn 控制TCP監聽隊列大小
-
/proc/sys/net/ipv4/tcp_fin_timeout 控制FIN_WAIT_2狀態的超時時長
-
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/vm
內存相關:
-
/proc/sys/vm/drop_caches
-
/proc/sys/vm/overcommit_memory
其它
history命令
一般/etc/profile文件中定義了history最多可顯示的歷史記錄數,控制變量名為HISTSIZE。如果只是想history過濾某些命令,可通過設置變量HISTIGNORE來實現,比如:
export HISTIGNORE="*mooon_ssh*:*mooon_upload*:*mooon_download*" |
---|
如果全局設置,可寫入文件/etc/profile,不過一般不建議修改/etc/profile,而改為在目錄/etc/profile.d下新建一個文件方式。
shell中函數繼承問題
我們知道變量是會被子進程繼承的,可以直接使用。有些情況下可能需要繼承函數,以方便透明使用,方法非常簡單,使用“export
-f”,注意參數“-f”,它表示函數的意思,不帶參數的export只針對變量。
function ifprop() { echo ":$1=$2" } export -f ifprop |
---|
也可以使用“typeset -fx”替代“export -f”。
查看Linux各發行版本方法
基本上各發行版本均在/etc目錄下有個后綴為“-release”的文件,該文件即存儲了發行版本的版本號信息,如:
- SuSE
cat /etc/SuSE-release |
---|
- Slackware
cat /etc/slackware-version |
---|
- Redhat
cat /etc/redhat-release |
---|
取IP地址命令
netstat -ie|awk /broadcast/'{print $2}' netstat -ie|awk -F '[ :]+' /cast/'{print $4}' netstat -ie|awk -F '[ :]+' /cast/'{print $3}' |
---|
清除系統緩存
echo 3 > /proc/sys/vm/drop_caches |
---|
測試請參見:http://blog.chinaunix.net/uid-20682147-id-4209165.html。
查看TCP數據
cat /proc/net/tcp |
---|
查看UDP數據
cat /proc/net/udp |
---|
查看socket緩沖區默認大小
cat /proc/sys/net/core/rmem_default |
---|
查看socket緩沖區最大大小
cat /proc/sys/net/core/rmem_max |
---|
找出CPU占用最高的線程
ps -mp 20693 -o THREAD,tid,time | sort -rn |
---|
Linux上查找造成IO高負載的進程
- 方法1:使用iotop工具
這是一個python腳本工具,使用方法如:iotop -o |
---|
- 方法2:使用工具dmesg
使用dmesg之前,需要先開啟內核的IO監控:
echo 1 >/proc/sys/vm/block_dump或sysctl vm.block_dump=1 |
---|
然后可以使用如下命令查看IO最重的前10個進程:
dmesg |awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -n 10 |
---|
- 方法3:使用命令“iostat -x 1“確定哪個設備IO負載高
# iostat -x 1 3 avg-cpu: %user %nice %system %iowait %steal %idle 1.06 0.00 0.99 1.09 0.00 97.85 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 0.49 17.29 1.74 6.75 23.47 200.18 11.73 100.09 26.33 0.10 12.25 5.73 4.87 |
---|
找“await”值最大的設備(Device),如上的結果即為sda。然后使用mount找到sda掛載點,再使用fuser命令查看哪些進程在訪問,如:
# fuser -vm /data |
---|
iptables簡單應用
iptables命令操作只對當前登錄有效,如果需重啟后也有效,可將操作放到/etc/rc.d/boot.local中,如:
/sbin/iptables -F /sbin/iptables -A INPUT -i eth0 -p tcp --sport 80 -j ACCEPT /sbin/iptables -A INPUT -i eth0 -p tcp -j DROP /sbin/iptables -A INPUT -i eth0 -p udp -j DROP |
---|
iptables是一個鏈的方式從前往后判斷,如果前面的規則成立就不會往后繼續,所以要注意順序,每行對應一條規則。
參數“-A”是Append意思,也就是追加;參數“-I”是Insert意思,也就是插入;參數“-F”是Flush意思,表示清除(即刪除)掉已有規則,也就是清空。
查看已有的規則,執行命令:
iptables -L -n |
---|
帶行號顯示結果(DEL操作需要指定行號):
# iptables -L -n --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:443 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:443 3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:443 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:443 6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8000 7 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:443 8 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 9 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 10 DROP udp -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination |
---|
從上可以看到,iptables有三種規則鏈(Chain):
-
INPUT 用於指定輸入規則,比如外部是可以訪問本機的80端口;
-
OUTPUT 用於指定輸出規則,比如本機是否可以訪問外部的80端口;
-
FORWARD
用於指定端口轉發規則(相當於rinetd功能),比如將8080端口的數據轉到到80端口。
參數“-I”和參數“-A”需要指定鏈(Chain)名,其中“-I”的鏈名后還需要指定第幾條(行)規則。
可通過“-D”參數刪除規則,有兩種刪除方式,一是匹配模式,二是指定第幾條(行)。也可以通過“-R”參數修改已有規則,另外“-L”參數后也可以跟鏈(Chain)名,表示只列出指定鏈的所有規則。“-j”參數后跟的是動作,即滿足規則時執行的操作,可以為ACCEPT、DROP、REJECT和REDIRECT等。
在iptables的INPUT鏈的第一行插入一條規則(可訪問其它機器的80端口):
iptables -I INPUT 1 -p tcp --sport 80 -j ACCEPT |
---|
在iptables的INPUT鏈尾追加一條規則(可訪問其它機器的80端口):
iptables -A INPUT -p tcp --sport 80 -j ACCEPT |
---|
如果要讓其它機器可以訪問本機的80端口,則為:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT |
---|
插入前:
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 DROP udp -- 0.0.0.0/0 0.0.0.0/0 |
---|
插入:
# iptables -I INPUT 1 -p tcp --sport 80 -j ACCEPT |
---|
插入后:
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 DROP udp -- 0.0.0.0/0 0.0.0.0/0 |
---|
追加前:
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 DROP udp -- 0.0.0.0/0 0.0.0.0/0 |
---|
追加:
# iptables -I INPUT 1 -p tcp --sport 80 -j ACCEPT |
---|
追加后(ACCEPT將不能生效):
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 DROP udp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 |
---|
刪除INPUT的第3條(即第3行,執行“iptables -L INPUT
--line-numbers”顯示行號)規則:
iptables -D INPUT 3 |
---|
配置DNS客戶端方法
配置DNS客戶端的方法非常簡單,需要修改兩個文件:
- 修改/etc/resolv.conf
在這個文件里增加DNS服務器的IP地址,格式為:nameserver DNS服務器IP地址
如:
nameserver 192.168.1.46 |
---|
可以有多行nameserver,如:
nameserver 192.168.1.46 nameserver 219.133.38.2 nameserver 219.133.38.3 |
---|
- 修改/etc/nsswitch.conf
在這個文件中增加如下內容即可:
hosts: files dns networks: files dns |
---|
現在即可ping域名了,如:ping
www.hadoopor.com。當然在ping之前要保證該機器是可以正常連接到DNS服務器的,DNS服務器的默認端口號為53,可以通過telnet命令來測試是否能夠連接到DNS服務器,如:telnet
192.168.1.46 53。
crontab使用環境變量
有兩種方式在crontab中定義變量:
- 直接在crontab中定義變量
A=123 * * * * * echo $A > /tmp/a.txt |
---|
注意在定義變量時不能使用$引用其它變量,如下面的做法錯誤:
A=123 B=$A |
---|
- 在/etc/environment中定義變量
此文件定義變量的格式為:
NAME=VALUE |
---|
同crontab,也不能使用$引用其它變量。操作系統在登錄時使用的第一個文件是/etc/environment文件,/etc/environment文件包含指定所有進程的基本環境的變量。
千萬注意,不要有“PATH=$PATH:/usr/local/jdk/bin”這樣的用法,這將導致系統無法啟動。
小技巧:想保持多台機器的crontab一致,但變量值不完全相同,這個時候可以考慮將變量配置在/etc/environment中,這樣crontab就可以相同了。
如機器1:
A=123 |
---|
機器2:
A=456 |
---|
兩者的crontab配置:
* * * * * echo "$A" > /x.txt |
---|
一般不建議直接修改/etc/environment,而可采取在目錄/etc/profile.d下新增一個.sh文件方式替代。但如果想crontab中生效,則只能修改/etc/environment,經測試/etc/profile.d方式不起作用。
另外注意在/etc/environment設置的變量,在shell中並不生效,但對crontab有效。
幾種修改Linux主機名的方法
在安裝一些系統時,需要修改hostname,比如安裝Hadoop時需要修改主機名,而且主機名不能包含下划線。
實際上,主機名分三種(命令hostnamectl或hostnamectl
status可查看三種主機名):
-
“pretty”主機名,UTF8格式的主機名,這個僅供閱讀,長度無限制;
-
“static”主機名,日常所稱的主機名(traditional
hostname)。最多為64個字符,僅可包含“.”、“_”、“-”、“a-z”、“A-Z”和“0-9”這些字符,並且不能以“.”打頭和結尾,也不能兩個“.”連續; -
“transient”主機名,內核維護的動態主機名,初始化為“static”主機名,默認為localhost。也為hadoop要求的主機名,它的約束規則同“static”主機名。如果存在“static”主機名,且不是“localhost”,那么將忽略“transient”主機名。“transient”主機名可被DHCP和mDNS修改。
當三種主機名相同時,“hostnamectl
status”只會顯示“static”主機名,三種主機名的設置方法:
hostnamectl --pretty set-hostname NAME hostnamectl --static set-hostname NAME hostnamectl --transient set-hostname NAME |
---|
hostnamectl修改的主機名,在系統重啟之前會一直有效,而hostname只對當次有效。如果不指定參數,則一次設置三種主機名:
hostnamectl set-hostname NAME |
---|
臨時修改主機名
命令hostname不但可以查看主機名,還可以用它來修改主機名,格式為:hostname
新主機名。
在修改之前9.4.149.11對應的主機名為hadoop_10202,而9.4.149.6對應的主機名為hadoop_10203。兩者的主機名均帶有下划線,因此需要修改。為求簡單,僅將原下划線去掉:
hostname hadoop10202
hostname hadoop10203
經過上述修改后,類似於修改環境變量,只臨時有效,還需要修改相應的系統配置文件,以永久有效。
永久修改主機名
不同的Linux發行版本,對應的系統配置文件可能不同,SuSE 10.1是/etc/HOSTNAME:
# cat /etc/HOSTNAME hadoop_10202 |
---|
將文件中的“hadoop_10202”,改成“hadoop10202”。有些Linux發行版本對應的可能是/etc/hostname文件,有些如CentOS和RedHat同時有/etc/hostname和/etc/sysconfig/network兩個文件,修改/etc/hostname即可。
需注意:/etc/sysconfig/network的格式和/etc/hostname、/etc/HOSTNAME不同,為:
HOSTNAME=主機名 |
---|
修改之后,需要重啟網卡,以使修改生效,執行命令:/etc/rc.d/boot.localnet
start(不同系統命令會有差異,這是SuSE上的方法,其它一些可能為:/etc/init.d/network
restart或service network
restart等),再次使用hostname查看,會發現主機名變了。
上述方法如果不能永久有效,則可使用hostnamectl修改來修改永久有效。如果還是不行,則可重啟系統以使永久有效。
可以通過以下多種方法查看主機名:
-
hostname命令(也可以用來修改主機名,但當次僅當次會話有效)
-
hostnamectl命令(也可以用來修改主機名,系統重啟前一直有效)
-
cat /proc/sys/kernel/hostname
-
cat /etc/hostname或cat /etc/sysconfig/network(永久性的修改,需要重啟)
-
sysctl kernel.hostname(也可以用來修改主機名,但僅重啟之前有效)
批量修改/etc/hostname工具(其它可參照):
https://github.com/eyjian/libmooon/blob/master/shell/set_hostname.sh |
---|
區別
方法 | 效果 |
---|---|
hostname | 當次登錄臨時有效,新登錄或重新登錄后無效 |
hostnamectl | 系統重啟之前一直有效,重啟后無效 |
/etc/hostname | 只有在系統重啟后才有效 |
process_monitor.sh進程監控重啟工具
使用process_monitor.sh監控進程,當進程掛掉后,能夠在兩三秒內將進程重拉起,並且支持同一程序以不同參數啟動多個實例,和不同用戶以相同參數啟動多個實例。
下載:https://github.com/eyjian/libmooon/blob/master/shell/process_monitor.sh。
一般建議將process_monitor.sh放在/usr/local/bin目錄下,並設置好可執行權限,放在crontab中運行。
- 示例1:監控redis進程
* * * * * /usr/local/bin/process_monitor.sh "/data/redis/bin/redis-server 6379" "/data/redis/bin/redis-server /data/redis/conf/redis-6379.conf" * * * * * /usr/local/bin/process_monitor.sh "/data/redis/bin/redis-server 6380" "/data/redis/bin/redis-server /data/redis/conf/redis-6380.conf" |
---|
- 示例2:監控zookeeper進程
* * * * * /usr/local/bin/process_monitor.sh "/usr/local/jdk/bin/java -Dzookeeper" "/data/zookeeper/bin/zkServer.sh start" |
---|
process_monitor.sh啟動后,會在/tmp目錄下創建以“/process_monitor-”打頭的日志文件,假設root用戶運行process_monitor.sh,則日志全路徑為:/tmp/process_monitor-root.log。
遠程批量操作工具
遠程批量工具包含:
-
批量命令工具mooon_ssh;
-
批量上傳文件工具mooon_upload;
-
批量下載文件工具mooon_download。
可執行二進制包下載地址:
https://github.com/eyjian/libmooon/releases
源代碼包下載地址:
https://github.com/eyjian/libmooon/archive/master.zip
批量工具除由三個工具組成外,還分兩個版本:
-
C++版本
-
GO版本
當前C++版本比較成熟,GO版本相當簡略,但C++版本依賴C++運行時庫,不同環境需要特定編譯,而GO版本可不依賴C和C++運行時庫,所以不需編譯即可應用到廣泛的Linux環境。
使用簡單,直接執行命令,即會提示用法,如C++版本:
$ mooon_ssh parameter[-c]'s value not set usage: -h[]: Connect to the remote machines on the given hosts separated by comma, can be replaced by environment variable 'H', example: -h='192.168.1.10,192.168.1.11' -P[36000/10,65535]: Specifies the port to connect to on the remote machines, can be replaced by environment variable 'PORT' -u[]: Specifies the user to log in as on the remote machines, can be replaced by environment variable 'U' -p[]: The password to use when connecting to the remote machines, can be replaced by environment variable 'P' -t[60/1,65535]: The number of seconds before connection timeout -c[]: The command is executed on the remote machines, example: -c='grep ERROR /tmp/*.log' -v[1/0,2]: Verbosity, how much troubleshooting info to print |
---|
批量執行命令工具:mooon_ssh
參數名 | 默認值 | 說明 |
---|---|---|
-u | 無 | 用戶名參數,可用環境變量U替代 |
-p | 無 | 密碼參數,可用環境變量P替代 |
-h | 無 | IP列表參數,可用環境變量H替代 |
-P | 22,可修改源碼,編譯為常用端口號 | SSH端口參數,可用環境變量PORT替代 |
-c | 無 | 在遠程機器上執行的命令,建議單引號方式指定值,除非要執行的命令本身已經包含了單引號有沖突。使用雙引號時,要注意轉義,否則會被本地shell解釋 |
-v | 1 | 工具輸出的詳細度 |
-thr | 1 | 線程數,當線程數大於2時,並發執行;如果值為0,表示線程數和IP數相同 |
批量上傳文件工具:mooon_upload
參數名 | 默認值 | 說明 |
---|---|---|
-u | 無 | 用戶名參數,可用環境變量U替代 |
-p | 無 | 密碼參數,可用環境變量P替代 |
-h | 無 | IP列表參數,可用環境變量H替代 |
-P | 22,可修改源碼,編譯為常用端口號 | SSH端口參數,可用環境變量PORT替代 |
-s | 無 | 以逗號分隔的,需要上傳的本地文件列表,可以帶相對或絕對目錄 |
-d | 無 | 文件上傳到遠程機器的目錄,只能為單個目錄 |
-thr | 1 | 線程數,當線程數大於2時,並發執行;如果值為0,表示線程數和IP數相同 |
使用示例
- 使用示例1:上傳/etc/hosts
mooon_upload -s=/etc/hosts -d=/etc |
---|
- 使用示例2:檢查/etc/profile文件是否一致
mooon_ssh -c='md5sum /etc/hosts' |
---|
- 使用示例3:批量查看crontab
mooon_ssh -c='crontab -l' |
---|
- 使用示例4:批量清空crontab
mooon_ssh -c='rm -f /tmp/crontab.empty;touch /tmp/crontab.empty' mooon_ssh -c='crontab /tmp/crontab.emtpy' |
---|
- 使用示例5:批量更新crontab
mooon_ssh -c='crontab /tmp/crontab.online' |
---|
- 使用示例6:取遠端機器IP
因為awk用單引號,所以參數“-c”的值不能使用單引號,所以內容需要轉義,相對其它來說要復雜點:
mooon_ssh -c="netstat -ie | awk -F[\\ :]+ 'BEGIN{ok=0;}{if (match(\$0, \"eth1\")) ok=1; if ((1ok) && match(\$0,\"inet\")) { ok=0; if (**7NF**) printf(\"%s\\n\",\$3); else printf(\"%s\\n\",\$4);} }'" |
---|
不同的環境,IP在“netstat
-ie”輸出中的位置稍有不同,所以awk中加了“7==NF”判斷,但仍不一定適用於所有的環境。需要轉義的字符包含:雙引號、美元符和斜杠。
- 使用示例7:批量查看kafka進程(環境變量方式)
$ export H=192.168.31.9,192.168.31.10,192.168.31.11,192.168.31.12,192.168.31.13 $ export U=kafka $ export P='123456' $ mooon_ssh -c='/usr/local/jdk/bin/jps -m' [192.168.31.15] 50928 Kafka /data/kafka/config/server.properties 125735 Jps -m [192.168.31.15] SUCCESS [192.168.31.16] 147842 Jps -m 174902 Kafka /data/kafka/config/server.properties [192.168.31.16] SUCCESS [192.168.31.17] 51409 Kafka /data/kafka/config/server.properties 178771 Jps -m [192.168.31.17] SUCCESS [192.168.31.18] 73568 Jps -m 62314 Kafka /data/kafka/config/server.properties [192.168.31.18] SUCCESS [192.168.31.19] 123908 Jps -m 182845 Kafka /data/kafka/config/server.properties [192.168.31.19] SUCCESS ================================ [192.168.31.15 SUCCESS] 0 seconds [192.168.31.16 SUCCESS] 0 seconds [192.168.31.17 SUCCESS] 0 seconds [192.168.31.18 SUCCESS] 0 seconds [192.168.31.19 SUCCESS] 0 seconds SUCCESS: 5, FAILURE: 0 |
---|
- 使用示例8:批量停止kafka進程(參數方式)
$ mooon_ssh -c='/data/kafka/bin/kafka-server-stop.sh' -u=kafka -p='123456' -h=192.168.31.15,192.168.31.16,192.168.31.17,192.168.31.18,192.168.31.19 [192.168.31.15] No kafka server to stop command return 1 [192.168.31.16] No kafka server to stop command return 1 [192.168.31.17] No kafka server to stop command return 1 [192.168.31.18] No kafka server to stop command return 1 [192.168.31.19] No kafka server to stop command return 1 ================================ [192.168.31.15 FAILURE] 0 seconds [192.168.31.16 FAILURE] 0 seconds [192.168.31.17 FAILURE] 0 seconds [192.168.31.18 FAILURE] 0 seconds [192.168.31.19 FAILURE] 0 seconds SUCCESS: 0, FAILURE: 5 |
---|
iptables入門
可修改/etc/rc.d/boot.local讓iptables操作在系統重啟后也生效,如:
/sbin/iptables -F /sbin/iptables -A INPUT -i eth0 -p tcp --sport 80 -j ACCEPT /sbin/iptables -A INPUT -i eth0 -p tcp -j DROP /sbin/iptables -A INPUT -i eth0 -p udp -j DROP |
---|
iptables是一個鏈的方式從前往后判斷,如果前面的規則成立就不會往后繼續,所以要注意順序,一般每行對應一條規則。
-A是Append意思,也就是追加 -I是Insert意思,也就是插入 -F表示清除(即刪除)掉已有規則,也就是清空 |
---|
查看已有的規則,執行命令:
iptables -L -n |
---|
如(參數-L為list意思,-n表示以數字方式顯示IP和端口,不指定-n則顯示為名稱,如:http即80端口):
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:443 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 DROP udp -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination |
---|
從可以看到:iptables有三種規則鏈(Chain),即INPUT、OUTPUT和FORWARD。
-
INPUT 用於指定輸入規則,比如外部是可以訪問本機的80端口
-
OUTPUT 用於指定輸出規則,比如本機是否可以訪問外部的80端口
-
FORWARD
用於指定端口轉發規則(相當於rinetd功能),比如將8080端口的數據轉到到80端口
-I和-A需要指定鏈(Chain)名,其中-I的鏈名后還需要指定第幾條(行)規則。
可通過-D參數刪除規則,有兩種刪除方式,一是匹配模式,二是指定第幾條(行)。
也可以通過-R參數修改已有規則,另外-L參數后也可以跟鏈(Chain)名,表示只列出指定鏈的所有規則。
-j參數后跟的是動作,即滿足規則時執行的操作,可以為ACCEPT、DROP、REJECT和REDIRECT等。
在iptables的INPUT鏈的第一行插入一條規則(可訪問其它機器的80端口):
iptables -I INPUT 1 -p tcp --sport 80 -j ACCEPT |
---|
在iptables的INPUT鏈尾追加一條規則(可訪問其它機器的80端口):
iptables -A INPUT -p tcp --sport 80 -j ACCEPT |
---|
如果要讓其它機器可以訪問本機的80端口,則為:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT |
---|
插入前:
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 DROP udp -- 0.0.0.0/0 0.0.0.0/0 |
---|
插入:
# iptables -I INPUT 1 -p tcp --sport 80 -j ACCEPT |
---|
插入后:
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 DROP udp -- 0.0.0.0/0 0.0.0.0/0 |
---|
追加前:
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 DROP udp -- 0.0.0.0/0 0.0.0.0/0 |
---|
追加:
# iptables -I INPUT 1 -p tcp --sport 80 -j ACCEPT |
---|
追加后(ACCEPT將不能生效):
# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 DROP udp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 |
---|
刪除INPUT的第3條(即第3行,執行“iptables -L INPUT
--line-numbers”顯示行號)規則:
iptables -D INPUT 3 |
---|