Linux后台開發工具箱-葵花寶典


Linux后台開發工具箱-葵花寶典

一見 2016/11/4

目錄

目錄 1

1. 前言 4

2. 腳本類工具 4

2.1. 雙引號和單引號 4

2.2. 取腳本完整文件路徑 5

2.3. 環境變量和變量 5

2.4. sed命令-字符串文本操作 5

2.5. sed和awk使用外部變量 6

2.6. awk給外部變量賦值 6

2.7. 浮點計算 6

2.8. 字符串操作 7

2.8.1. 刪除前尾空格 7

2.8.2. 大小寫轉換 7

2.8.3. 不區分大小寫比較 7

2.8.4. 取字符串長度 8

2.8.5. 遍歷字符串的每一個字符 8

2.8.6. 判斷字符串是否為數字 8

2.9. grep應用 9

2.9.1. 或關系 9

2.9.2. 與關系 9

2.10. ps應用 9

2.10.1. 查看指定進程名的進程ID 10

2.10.2. 查看指定進程名的進程ID和完整命令行
10

2.10.3. 查看指定進程ID的CPU,以下幾種都可以(“-o”后跟結果輸出格式format)
10

2.10.4. 查看指定進程ID的內存 10

2.10.5. 同時查看指定進程ID的內存百分比和CPU百分比
10

2.10.6. 查看指定進程ID的CPU百分比和虛擬內存(vsz單位為kb)
10

2.10.7. 查看指定進程ID的虛擬內存和物理內存(rss單位為kb)
10

2.11. awk應用 11

2.11.1. 取得IP和端口號 11

2.11.2. 取指定網卡上的IP地址 11

2.12. 日志滾動工具logrotate 11

3. 設備類工具 12

3.1. 查看網卡型號 12

3.2. dmidecode查看所有硬件信息工具 12

3.3. lscpu查看cpu工具 12

3.4. lspci查看主板工具 12

3.5. lsscsi查看SCSI卡工具 12

4. 系統類工具 12

4.1. 命令systemctl 12

4.2. 命令journalctl 13

4.3. 重啟服務 14

4.4. sar系統綜合工具 14

4.5. vmstat系統級內存監測工具 14

4.6. iostat系統級磁盤IO監測工具 14

4.7. iotop進程級磁盤IO監測工具 15

4.8. top和htop 15

4.9. 定時查看CPU 15

4.10. 查看系統中斷 16

4.11. 查看網卡中斷 16

4.12. 查看中斷親和性 16

4.13. lsof 16

4.14. fuser 17

4.15. free查看內存工具 17

4.16. screen、byobu和tmux分屏工具 17

4.17. dtach 17

4.18. slabtop查看內核slab緩存工具 17

4.19. dmesg檢測和控制內核環緩沖工具 17

4.20. dstat可取代vmstat/iostat/netstat/ifstat的工具
17

4.21. MultiTail類似tail的同時監控多個文檔工具
18

4.22. Monitorix系統和網絡監控工具 18

4.23. collectl全能性能監控工具 18

4.24. percona工具包 19

5. 磁盤工具 19

5.1. fio-磁盤IOPS測試工具 20

5.2. sysbench 21

5.3. sfdisk分區工具 21

5.4. fdisk分區工具 22

5.5. cfdisk分區工具 22

5.6. parted分區工具 22

5.7. gparted分區工具 22

5.8. SCSI工具 22

5.9. RAID工具 22

5.10. hdparm磁盤性能測試工具 22

5.11. mount掛載磁盤工具 22

5.12. mkfs創建文件系統工具 22

5.13. df查看磁盤容量工具 23

5.14. du統計目錄和文件大小工具 23

6. 進程類工具 23

6.1. pwdx命令-查看工作目錄 23

6.2. pidof命令-查看進程ID 23

6.3. nice和ionice優先級調整工具 23

6.4. pstack查看調用棧工具 23

6.5. 查看可執行程序和共享庫工具 23

6.6. ps命令 23

6.7. 按CPU使用率排序 24

6.8. 按內存使用率排序 25

6.9. pmap和查看進程內存映射 25

7. 性能類工具 26

7.1. valgrind和qcachegrind內存分析工具 28

7.2. perf性能分析工具 28

7.3. 壓力測試工具:ab、tsung、siege 28

8. 網絡類工具 28

8.1. netstat和ss命令 28

8.2. ifconfig和ip命令 28

8.3. ifdown和ifup 29

8.4. tcpdump網絡抓包工具 29

8.5. ifstat網絡流量實時查看工具 31

8.6. iptraf實時IP局域網監控 32

8.7. iftop網絡帶寬監控 32

8.8. nethogs網絡帶寬監控 32

8.9. slurm查看網絡流量工具 32

8.10. Arpwatch以太網活動監控器 32

8.11. Suricata網絡安全監控 32

8.12. Nagios網絡/服務器監控 32

8.13. socat多功能的網絡工具 32

8.14. mtr網絡連通性判斷工具 32

8.15. 查看網卡統計 32

8.16. 查看網卡RingBuffer大小 32

8.17. sar查看網絡流量 32

8.18. tcpcopy引流 33

9. /proc文件系統 33

9.1. /proc/meminfo 33

9.2. /proc/cpuinfo 33

9.3. /proc/PID和/proc/PID/maps 33

9.4. /proc/irq/ 34

9.5. /proc/net 34

9.6. /proc/sys/fs 34

9.7. /proc/sys/net 34

9.8. /proc/sys/vm 34

10. 其它 35

10.1. history命令 35

10.2. shell中函數繼承問題 35

10.3. 查看Linux各發行版本方法 35

10.4. 取IP地址命令 36

10.5. 清除系統緩存 36

10.6. 查看TCP數據 36

10.7. 查看UDP數據 36

10.8. 查看socket緩沖區默認大小 36

10.9. 查看socket緩沖區最大大小 36

10.10. 找出CPU占用最高的線程 36

10.11. Linux上查找造成IO高負載的進程 36

10.12. iptables簡單應用 37

10.13. 配置DNS客戶端方法 39

10.14. crontab使用環境變量 40

11. 幾種修改Linux主機名的方法 41

11.1. 臨時修改主機名 41

11.2. 永久修改主機名 41

11.3. 區別 42

12. process_monitor.sh進程監控重啟工具 42

13. 遠程批量操作工具 43

13.1. 批量執行命令工具:mooon_ssh 44

13.2. 批量上傳文件工具:mooon_upload 44

13.3. 使用示例 44

14. iptables入門 47

前言

本文是個大雜燴,內容為日常點滴的日積月累,持續更新當中,可關注博客(https://blog.csdn.net/Aquesterhttp://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”。

  1. 單引號替換(特殊字符需要使用反斜線”\”進行轉義)
sed 's/原字符串/替換字符串/'
  1. 雙引號替換(如要替換的包含了“/”,則可使用“|”做分隔符)
sed "s/原字符串包含'/替換字符串包含'/"
  1. 問號替換
sed 's?原字符串?替換字符串?'
  1. 同時多個替換

不同替換間使用分號分開。

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

浮點計算

  1. 使用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
  1. 使用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
  1. 轉換為小寫(BASH-4.0開始支持,打開bash.html后搜索“,,”)
A="aBc" echo $A A="${A,,}" echo $A
  1. 轉換為大寫(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的部分用法。

  1. 系統管理
systemctl poweroff # 關機 systemctl reboot # 重啟 systemctl rescue # 進入單用戶模式 systemd-analyze # 查看系統啟動時間 loginctl list-users # 列出當前登錄用戶 loginctl user-status root # 查看用戶root的狀態
  1. 查看系統狀態
systemctl status
  1. 管理單元

如啟動MySQL(這要求在目錄/lib/systemd/system下存在文件mysql.service):

systemctl status mysql.service
  1. 查看單元依賴

比如查看crond的依賴:

systemctl list-dependencies crond.service

又比如查看sshd的依賴:

systemctl list-dependencies sshd.service

命令journalctl

systemd出現之前,Linux系統及各應用的日志都是分別管理的,systemd開始統一管理了所有Unit的啟動日志,這樣可以只用一個journalctl命令,查看所有內核和應用的日志,下面只列出了journalctl命令的小部分用法。

  1. 查看日志
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
  1. 查看指定時間日志
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"
  1. 查看指定進程日志
journalctl _PID=`pidof crond`
  1. 查看指定用戶日志
journalctl _UID=`id -r -u root` --since today

重啟服務

不同發行版的Linux,重啟服務可能有些區別,這里以CentOS為例重啟crontab服務:

  1. 方式一:
service crond restart
  1. 方式二:
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”指定刷新頻率,單位為秒。

  1. 查看tps(每秒I/O次數):iostat -d -m
    2(單位:MB,刷新間隔2秒),iostat -d -k 2(單位:KB)

  2. 查看擴展數據:iostat -x -m 2(刷新間隔2秒)

  3. 查看設備使用率和響應時間: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”,可用來查看進程打開了哪些文件,也可用來查看一個文件被哪些進程打開了,或者一個端口是哪個進程打開的等。

  1. 查看端口被誰占用
lsof -i:port,如:lsof -i:80
  1. 顯示開啟文件abc.txt的進程
lsof abc.txt
  1. 顯示abc進程現在打開的文件
lsof -c abc
  1. 顯示目錄下被進程開啟的文件
lsof +d /usr/local/
  1. 顯示使用fd為4的進程
lsof -d 4
  1. 以UID,列出打開的文件
lsof -u username
  1. 看進程號為12的進程打開了哪些文件
lsof -p 12
  1. 反復執行,刷新頻率為2秒
lsof -i:10888 -r 2

ls +r 死循環執行,直到沒有結果,如已沒有程序占用端口號10888。

fuser

和lsof有些類似的功能,可查看文件、文件系統或套接字被哪些進程打開了。使用示例:

  1. 查看持有端口2019的進程
fuser -v -n tcp 2019
  1. 殺掉所有打開文件/tmp/test的進程
fuser -m -k /tmp/test fuser -m -k -i /tmp/test
  1. 查看文件/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. 示例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
  1. 示例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. 示例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
  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
  1. 示例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
  1. 示例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等。

  1. 查詢程序執行聚合的GDB堆棧跟蹤,先進性堆棧跟蹤,然后將跟蹤信息匯總:
pt-pmp -p pid
  1. 格式化explain出來的執行計划按照tree方式輸出,方便閱讀:
pt-visual-explain
  1. 從log文件中讀取插敘語句,並用explain分析他們是如何利用索引,完成分析之后會生成一份關於索引沒有被查詢使用過的報告:
pt-index-usage

磁盤工具

fio-磁盤IOPS測試工具

磁盤IOPS測試工具。MAN手冊:https://linux.die.net/man/1/fio,源代碼:http://freshmeat.sourceforge.net/projects/fio/

  1. 隨機寫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
  1. 隨機讀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
  1. 順序寫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
  1. 順序讀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
  1. randwrite 測試隨機寫

  2. randread 測試隨機讀

  3. randrw 測試隨機讀寫

  4. write 測試順序寫

  5. read 測試順序讀

  6. sync(基於read、write、fseek)

  7. psync(基於pread、pwrite)

  8. vsync(基於readv、writev)

  9. libaio(Linux內核異步I/O)

  10. posixaio(基於Posix標准的異步I/O:aoi_read、aoi_write)

  11. solarisaio(基於Solaris原生異步I/O)

  12. windowsaio(基於Windows原生異步I/O)

  13. 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工具

  1. dmesg |grep SCSI

  2. lsscsi

RAID工具

  1. dmesg |grep -i raid

  2. 查看軟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。

查看可執行程序和共享庫工具

  1. objdump

  2. nm 經常用來查看共享庫是否包含了某個符號

  3. ldd 查看依賴關系工具

  4. strings 列出符號

  5. strip 刪除符號表工具

  6. Readelf

ps命令

“ps”為“Process
Snapshot”的縮寫,使用頻繁的用來查看當前進程的快照工具,數據來源於虛擬文件“/proc”,如果輸出結果的用戶名太長,則會用數字型的用戶ID替代。

ps支持三種風格的命令行參數:

  1. UNIX 必須以“-”打頭,可以分組

  2. BSD 不能以“-”打頭,也可以分組

  3. GNU 以兩個“-”打頭\

三種風格可以混合使用,但可能有沖突,三種風格有些名稱相同但含義不同。以查看系統中所有進程為例:

  1. 標准語法:ps -ef或ps -eF等

  2. BSD語法:ps aux或ps ax

查看進程樹:

  1. 標准語法:ps -ejH

  2. BSD語法:ps axjf

查看線程:

  1. 標准語法:ps -eLf

  2. BSD語法:ps axms

查看root運行的所有進程:ps -U root -u root u。以指定格式查看:

  1. ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm

  2. ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

  3. 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使用率排序

  1. 顯示CPU使用率最高的前5個進程:

ps -Ao pcpu,comm,pid,user,uid,tty --sort=-pcpu | head -n 6

說明:

  1. -A 表示顯示所有進程

  2. pcpu CPU使用率真

  3. comm 進程名(不包含路徑)

  4. pid 進程ID

  5. user 用戶名

  6. --sort 指定按什么排序

  7. 顯示CPU使用率最低的前5個進程:

ps -Ao pcpu,comm,pid,user,uid,tty --sort=pcpu | head -n 6

注意,這里是“-pcpu”,不是“pcpu”,前者按高到低排,后者從低到高排,順序剛好相反。“pcpu”可用“%cpu”替代,效果完全相同。

如果按物理內存排序,用“rss”替代“pcpu”,按虛擬內存排,用“vsz”替代“pcpu”即可。

按內存使用率排序

  1. 顯示物理內存占用最高的前5個進程:

ps -Ao rss,pcpu,comm,pid,user,uid,tty --sort=-rss| head -n 6

  1. 顯示物理內存占用最低的前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. 示例1:設置一個IP
ip addr add 192.168.31.13/24 dev eth1
  1. 示例2:查看設置的IP是否生效
ip addr show eth1
  1. 示例3:刪除IP
ip addr del 192.168.31.13/24 dev eth1
  1. 示例4:查看路由表
ip route show

ifdown和ifup

ifdown和ifup實際是基於ifconfig的Shell腳本,可用ifdown禁用指定網卡,如“ifdown
eth1”,而ifup則相反,用於啟用指定網卡。

tcpdump網絡抓包工具

參數“-s”指定顯示多少字節的包內容,-x表示僅以十六進制輸出,-X表示同時以十六進制和文本方式輸出,-e表示輸出鏈接級別的頭,-w指定結果寫入文件。

  1. 顯示包的內容:
tcpdump -i eth1 -n -vv -x -e -s 600 # 僅二進制 tcpdump -i eth1 -n -vv -X -e -s 600 # 二進制和文本
  1. 抓包保存到文件供Wireshark分析:
tcpdump -i eth1 -n -vv -X -e -s 600 -w x.cap
  1. 抓取192.168.31.1的80端口的包:
tcpdump -i eth1 host 192.168.31.1 and port 80
  1. 抓取目標IP為192.168.31.1和目標端口為80端口的包:
tcpdump -i eth1 dst host 192.168.31.1 and dst port 80
  1. 監聽指定網卡
tcpdump -i eth1
  1. 監聽指定UDP端口
tcpdump udp port 10888
  1. 監聽指定TCP端口
tcpdump tcp port 80
  1. 監聽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 \)
  1. 監聽A的所有通訊,但不包括A和B的
tcpdump ip A and not B
  1. 監聽A發出的所有包
tcpdump -i eth1 src host A
  1. 監聽所有發送到B的包
tcpdump -i eth1 dst host B
  1. 監聽A收到或發出的所有http包
tcpdump tcp port 80 and host A
  1. 列出tcpdump能夠監聽的網卡
tcpdump -D
  1. 監聽所有網卡,要求2.2或更高版本內核
tcpdump -i any
  1. 詳細顯示捕獲的信息
tcpdump -v

更詳細可以使用“tcpdump -vv”和“tcpdump -vvv”。

  1. 以十六進制和ASCII方式打印包,除了連接層頭
tcpdump -v -X
  1. 以十六進制和ASCII方式打印包,包括連接層頭
tcpdump -v -XX
  1. 限制捕獲100個包
tcpdump -c 100
  1. 將記錄寫入文件
tcpdump -w filename.log
  1. 使用IP代替域名
tcpdump -n
  1. 捕獲每個包的100字節而不是默認的68字節
tcpdump -s 500

如果要捕獲所有字節則為:tcpdump -s 0。

  1. 捕獲所有廣播或多播包
tcpdump -n "broadcast or multicast"
  1. 捕獲所有icmp和arp包
tcpdump -v "icmp or arp"
  1. 捕獲arp包
tcpdump -v arp
  1. 捕獲目標地址是192.168.0.1,端口是80或443的包
tcpdump -n "dst host 192.168.0.1 and (dst port 80 or dst port 443)"
  1. 捕獲目標端口號在1-1023間的UDP包
tcpdump -n udp dst portrange 1-1023
  1. 捕獲目標端口號為23的包
tcpdump dst port 23
  1. 捕獲目標網絡為192.168.1.0/24的包
tcpdump -n dst net 192.168.1.0/24
  1. 捕獲源網絡為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端口為例:

  1. 線上機器10.24.110.21
tcpcopy -x 4077-10.23.25.11:5000 -s 10.23.25.12 -c 192.168.100.x -n 1
  1. 測試機器10.23.25.11
route add -net 192.168.100.0 netmask 255.255.255.0 gw 10.23.25.12
  1. 輔助機器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/

  1. /proc/irq/

該目錄下存放的是以IRQ號命名的目錄,如/proc/irq/40/表示中斷號為40的相關信息。

  1. /proc/irq/[irq_num]/smp_affinity

該文件存放的是CPU位掩碼(十六進制),修改該文件中的值可以改變CPU和某中斷的親和性。

  1. /proc/irq/[irq_num]/smp_affinity_list

該文件存放的是CPU列表(十進制),注意CPU核心個數用表示編號從0開始,如cpu0和cpu1等。

/proc/net

網絡相關的:

  1. /proc/net/dev

可用來統計網卡流量。

  1. /proc/net/sockstat SOCKET的各類狀態

/proc/sys/fs

文件系統相關:

  1. /proc/sys/fs/file-max

  2. /proc/sys/fs/file-nr

  3. /proc/sys/fs/inode-nr

/proc/sys/net

網絡相關:

  1. /proc/sys/net/core/somaxconn 控制TCP監聽隊列大小

  2. /proc/sys/net/ipv4/tcp_fin_timeout 控制FIN_WAIT_2狀態的超時時長

  3. /proc/sys/net/ipv4/tcp_keepalive_intvl

/proc/sys/vm

內存相關:

  1. /proc/sys/vm/drop_caches

  2. /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”的文件,該文件即存儲了發行版本的版本號信息,如:

  1. SuSE
cat /etc/SuSE-release
  1. Slackware
cat /etc/slackware-version
  1. 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. 方法1:使用iotop工具
這是一個python腳本工具,使用方法如:iotop -o
  1. 方法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
  1. 方法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):

  1. INPUT 用於指定輸入規則,比如外部是可以訪問本機的80端口;

  2. OUTPUT 用於指定輸出規則,比如本機是否可以訪問外部的80端口;

  3. 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客戶端的方法非常簡單,需要修改兩個文件:

  1. 修改/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
  1. 修改/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中定義變量:

  1. 直接在crontab中定義變量
A=123 * * * * * echo $A > /tmp/a.txt

注意在定義變量時不能使用$引用其它變量,如下面的做法錯誤:

A=123 B=$A
  1. 在/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時需要修改主機名,而且主機名不能包含下划線。

實際上,主機名分三種(命令hostnamectlhostnamectl
status
可查看三種主機名):

  1. pretty”主機名,UTF8格式的主機名,這個僅供閱讀,長度無限制;

  2. static”主機名,日常所稱的主機名(traditional
    hostname)。最多為64個字符,僅可包含“.”、“_”、“-”、“a-z”、“A-Z”和“0-9”這些字符,並且不能以“.”打頭和結尾,也不能兩個“.”連續;

  3. 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修改來修改永久有效。如果還是不行,則可重啟系統以使永久有效。

可以通過以下多種方法查看主機名:

  1. hostname命令(也可以用來修改主機名,但當次僅當次會話有效)

  2. hostnamectl命令(也可以用來修改主機名,系統重啟前一直有效)

  3. cat /proc/sys/kernel/hostname

  4. cat /etc/hostname或cat /etc/sysconfig/network(永久性的修改,需要重啟)

  5. 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. 示例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"
  1. 示例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。

遠程批量操作工具

遠程批量工具包含:

  1. 批量命令工具mooon_ssh;

  2. 批量上傳文件工具mooon_upload;

  3. 批量下載文件工具mooon_download。

可執行二進制包下載地址:

https://github.com/eyjian/libmooon/releases

源代碼包下載地址:

https://github.com/eyjian/libmooon/archive/master.zip

批量工具除由三個工具組成外,還分兩個版本:

  1. C++版本

  2. 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. 使用示例1:上傳/etc/hosts
mooon_upload -s=/etc/hosts -d=/etc
  1. 使用示例2:檢查/etc/profile文件是否一致
mooon_ssh -c='md5sum /etc/hosts'
  1. 使用示例3:批量查看crontab
mooon_ssh -c='crontab -l'
  1. 使用示例4:批量清空crontab
mooon_ssh -c='rm -f /tmp/crontab.empty;touch /tmp/crontab.empty' mooon_ssh -c='crontab /tmp/crontab.emtpy'
  1. 使用示例5:批量更新crontab
mooon_ssh -c='crontab /tmp/crontab.online'
  1. 使用示例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”判斷,但仍不一定適用於所有的環境。需要轉義的字符包含:雙引號、美元符和斜杠。

  1. 使用示例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
  1. 使用示例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。

  1. INPUT 用於指定輸入規則,比如外部是可以訪問本機的80端口

  2. OUTPUT 用於指定輸出規則,比如本機是否可以訪問外部的80端口

  3. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM