Linux後臺開發工具箱

一見發表於2018-12-13

https://download.csdn.net/download/aquester/10847097

目錄

目錄 1

1. 前言 3

2. 指令碼類工具 3

2.1. sed命令-字串文字操作 3

2.2. sed和awk使用外部變數 4

2.3. awk給外部變數賦值 4

3. 裝置類工具 4

3.1. 檢視網路卡型號 4

3.2. dmidecode檢視所有硬體資訊工具 5

3.3. lscpu檢視cpu工具 5

3.4. lspci檢視主機板工具 5

3.5. lsscsi檢視SCSI卡工具 5

4. 系統類工具 5

4.1. sar系統綜合工具 5

4.2. vmstat系統級記憶體監測工具 5

4.3. iostat系統級磁碟IO監測工具 5

4.4. iotop程式級磁碟IO監測工具 6

4.5. top和htop 6

4.6. 定時檢視CPU 6

4.7. 檢視系統中斷 6

4.8. 檢視網路卡中斷 6

4.9. 檢視中斷親和性 6

4.10. lsof 6

4.11. fuser 7

4.12. free檢視記憶體工具 7

4.13. screen、byobu和tmux分屏工具 7

4.14. dtach 7

4.15. slabtop檢視核心slab快取工具 8

4.16. dmesg檢測和控制核心環緩衝工具 8

4.17. dstat可取代vmstat/iostat/netstat/ifstat的工具 8

4.18. MultiTail類似tail的同時監控多個文件工具 9

4.19. Monitorix系統和網路監控工具 9

4.20. collectl全能效能監控工具 9

4.21. percona工具包 10

5. 磁碟工具 10

5.1. sysbench 10

5.2. sfdisk分割槽工具 11

5.3. fdisk分割槽工具 11

5.4. cfdisk分割槽工具 11

5.5. parted分割槽工具 11

5.6. gparted分割槽工具 11

5.7. SCSI工具 11

5.8. RAID工具 11

5.9. hdparm磁碟效能測試工具 12

5.10. mount掛載磁碟工具 12

5.11. mkfs建立檔案系統工具 12

5.12. df檢視磁碟容量工具 12

5.13. du統計目錄和檔案大小工具 12

6. 程式類工具 12

6.1. pwdx命令-檢視工作目錄 12

6.2. pidof命令-檢視程式ID 12

6.3. nice和ionice優先順序調整工具 12

6.4. pstack檢視呼叫棧工具 12

6.5. 檢視可執行程式和共享庫工具 12

7. 效能類工具 13

7.1. valgrind和qcachegrind記憶體分析工具 13

7.2. perf效能分析工具 13

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

8. 網路類工具 13

8.1. netstat和ss命令 13

8.2. ifconfig和ip命令 13

8.3. tcpdump網路抓包工具 14

8.4. ifstat網路流量實時檢視工具 16

8.5. iptraf實時IP區域網監控 16

8.6. iftop網路頻寬監控 16

8.7. nethogs網路頻寬監控 16

8.8. slurm檢視網路流量工具 17

8.9. Arpwatch乙太網活動監控器 17

8.10. Suricata網路安全監控 17

8.11. Nagios網路/伺服器監控 17

8.12. socat多功能的網路工具 17

8.13. mtr網路連通性判斷工具 17

8.14. 檢視網路卡統計 17

8.15. 檢視網路卡RingBuffer大小 17

8.16. sar檢視網路流量 17

9. /proc檔案系統 17

9.1. /proc/meminfo 18

9.2. /proc/cpuinfo 18

9.3. /proc/PID 18

9.4. /proc/irq/ 18

9.5. /proc/net 18

9.6. /proc/sys/fs 18

9.7. /proc/sys/net 19

9.8. /proc/sys/vm 19

10. 其它 19

10.1. shell中函式繼承問題 19

10.2. 檢視Linux各發行版本方法 19

10.3. 取IP地址命令 20

10.4. 清除系統快取 20

10.5. 檢視TCP資料 20

10.6. 檢視UDP資料 20

10.7. 檢視socket緩衝區預設大小 20

10.8. 檢視socket緩衝區最大大小 20

10.9. 找出CPU佔用最高的執行緒 20

10.10. Linux上查詢造成IO高負載的程式 20

10.11. iptables簡單應用 21

10.12. 配置DNS客戶端方法 23

10.13. crontab使用環境變數 24

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

11.1. 臨時修改主機名 25

11.2. 永久修改主機名 25

11.3. 區別 26

12. process_monitor.sh程式監控重啟工具 26

13. 遠端批量操作工具 27

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

13.2. 批量上傳檔案工具:mooon_upload 28

13.3. 使用示例 28

 

1. 前言

本文是個大雜燴,內容為日常點滴的日積月累,持續更新當中,可關注部落格(https://blog.csdn.net/Aquesterhttp://aquester.blog.chinaunix.net),檢視最新版本。文中的內容,可幫忙開發提升分析和定位各類問題,比如找出導致IO負載高的程式等,以及一些簡單的運維工作等。

2. 指令碼類工具

2.1. sed命令-字串文字操作

如需直接修改檔案方式替換,只需sed後帶引數“-i”。

 

1) 單引號替換(特殊字元需要使用反斜線”\”進行轉義)

sed 's/原字串/替換字串/'

 

2) 雙引號替換(如要替換的包含了“/”,則可使用“|”做分隔符)

sed "s/原字串包含'/替換字串包含'/"

 

3) 問號替換

sed 's?原字串?替換字串?'

 

4) 同時多個替換

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

2.2. sed和awk使用外部變數

x=MM

sed 's/AB/'$x'/g' filename

sed 's/AB/'"$x"'/g' filename

 

sed 's/'"$val"'//' filename

 

awk '{ print "'$x'" }' filename

2.3. 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命令,它在很多場景有特別的用處。

3. 裝置類工具

3.1. 檢視網路卡型號

lspci | grep -i ethernet

3.2. dmidecode檢視所有硬體資訊工具

3.3. lscpu檢視cpu工具

3.4. lspci檢視主機板工具

使用示例:

lspci -vvv

lspci -vvv -t

3.5. lsscsi檢視SCSI卡工具

4. 系統類工具

4.1. sar系統綜合工具

全稱“System Activity Reporter”,即系統活動情況報告,最為全面的系統效能分析工具之一,也可用來檢視網路流量。

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

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

4.4. iotop程式級磁碟IO監測工具

4.5. top和htop

htop為top的加強版本。

4.6. 定時檢視CPU

mpstat -P ALL 1

mpstat -I SUM 1

 

示例(每秒顯示一次):

mpstat -P ALL 1

4.7. 檢視系統中斷

cat /proc/interrupts

4.8. 檢視網路卡中斷

grep eth1 /proc/interrupts |awk '{print $NF}'

4.9. 檢視中斷親和性

cat /proc/irq/74/smp_affinity # 以中斷74為例

 

4.10. lsof

全稱“List Open Files”,可用來檢視程式開啟了哪些檔案,也可用來檢視一個檔案被哪些程式開啟了,或者一個埠是哪個程式開啟的等。

 

1) 檢視埠被誰佔用

lsof -i:port,如:lsof -i:80

 

2) 顯示開啟檔案abc.txt的程式

lsof abc.txt

 

3) 顯示abc程式現在開啟的檔案

lsof -c abc

 

4) 顯示目錄下被程式開啟的檔案

lsof +d /usr/local/

 

5) 顯示使用fd為4的程式

lsof -d 4

 

6) 以UID,列出開啟的檔案

lsof -u username

 

7) 看程式號為12的程式開啟了哪些檔案

lsof -p 12

 

8) 反覆執行,重新整理頻率為2秒

lsof -i:10888 -r 2

 

ls +r 死迴圈執行,直到沒有結果,如已沒有程式佔用埠號10888。

4.11. fuser

和lsof有些類似的功能,可檢視檔案、檔案系統或套接字被哪些程式開啟了。

4.12. free檢視記憶體工具

4.13. screen、byobu和tmux分屏工具

4.14. dtach

用來模擬screen的detach的功能的小工具:http://dtach.sourceforge.net/

4.15. slabtop檢視核心slab快取工具

4.16. dmesg檢測和控制核心環緩衝工具

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

 

2) 示例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

4.18. MultiTail類似tail的同時監控多個文件工具

4.19. Monitorix系統和網路監控工具

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

 

2) 示例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) 示例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) 示例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

4.21. percona工具包

簡稱PT(Percona Toolkit),可用來監控MySQL、MongoDB等。

1) 查詢程式執行聚合的GDB堆疊跟蹤,先進性堆疊跟蹤,然後將跟蹤資訊彙總:

pt-pmp -p pid

 

2) 格式化explain出來的執行計劃按照tree方式輸出,方便閱讀:

pt-visual-explain

 

3) 從log檔案中讀取插敘語句,並用explain分析他們是如何利用索引,完成分析之後會生成一份關於索引沒有被查詢使用過的報告:

pt-index-usage

5. 磁碟工具

5.1. 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 )

5.2. sfdisk分割槽工具

示例:列出所有分割槽

# sfdisk -l

5.3. fdisk分割槽工具

示例:列出所有分割槽

# fdisk -l

5.4. cfdisk分割槽工具

具有互動式操作介面的磁碟分割槽工具,引數-P表示顯示分割槽表的內容,附加引數“s”會依照磁區的順序顯示相關資訊。

5.5. parted分割槽工具

一個由GNU開發的功能強大的磁碟分割槽和分割槽大小調整工具。

5.6. gparted分割槽工具

parted的圖形化版本。

5.7. SCSI工具

1) dmesg |grep SCSI

2) lsscsi

5.8. RAID工具

1) dmesg |grep -i raid

2) 檢視軟RAID:cat /proc/mdstat

5.9. hdparm磁碟效能測試工具

使用示例:hdparm -t /dev/sda。

5.10. mount掛載磁碟工具

檔案/etc/fstab的內容和mount輸出是一致的。

5.11. mkfs建立檔案系統工具

掛載一塊磁碟之前,需要先建立好檔案系統。

5.12. df檢視磁碟容量工具

5.13. du統計目錄和檔案大小工具

6. 程式類工具

6.1. pwdx命令-檢視工作目錄

根據程式ID,檢視指定程式的當前工作目錄(注意不是程式檔案所在目錄),格式:pwdx pid,如pwdx 1。

6.2. pidof命令-檢視程式ID

根據程式名,檢視程式的ID,格式:pidof 程式名,如:pidof init。

6.3. nice和ionice優先順序調整工具

nice是程式的CPU優先順序檢視和調整工具,ionice是程式的IO優先順序檢視和調整工具。

6.4. pstack檢視呼叫棧工具

根據程式ID,檢視指定程式呼叫棧的工具,格式:pstack pid。

6.5. 檢視可執行程式和共享庫工具

1) objdump

2) nm 經常用來檢視共享庫是否包含了某個符號

3) ldd 檢視依賴關係工具

4) strings 列出符號

5) strip 刪除符號表工具

6) readelf

7. 效能類工具

7.1. valgrind和qcachegrind記憶體分析工具

開源的記憶體分析和效能分析工具。qcachegrind是一個valgrind輔助工具,視覺化方式檢視valgrind效能分析結果。

7.2. perf效能分析工具

Linux自帶的功能強大的效能分析工具,可結合火焰圖。使用方式,如:perf top -p pid。自帶了生成SVG格式的圖形化工具timechart。

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

8. 網路類工具

8.1. netstat和ss命令

ss是一個可以替代netstat的網路連線檢視工具(socket statistics)。

 

示例1:檢視TCP監聽

netstat -lpnt

 

示例1:檢視TCP連線

netstat -lpna

8.2. ifconfig和ip命令

ip是一個可以替代ifconfig和route等的網路管理工具,為iproute2套件中的一員,而ifconfig是net-tools中已被廢棄使用的一個命令,許多年前就已經沒有維護了。

 

1) 示例1:設定一個IP

ip addr add 192.168.31.13/24 dev eth1

 

2) 示例2:檢視設定的IP是否生效

ip addr show eth1

 

3) 示例3:刪除IP

ip addr del 192.168.31.13/24 dev eth1

 

4) 示例4:檢視路由表

ip route show

8.3. tcpdump網路抓包工具

引數“-s”指定顯示多少位元組的包內容。

 

1) 顯示包的內容:

tcpdump -i eth1 -n -vv -x -e -s 600 # 僅二進位制

tcpdump -i eth1 -n -vv -X -e -s 600 # 二進位制和文字

 

2) 抓包儲存到檔案供Wireshark分析:

tcpdump -i eth1 -n -vv -X -e -s 600 -w x.cap

 

3) 抓取192.168.31.1的80埠的包:

tcpdump -i eth1 host 192.168.31.1 and port 80

 

4) 抓取目標IP為192.168.31.1和目標埠為80埠的包:

tcpdump -i eth1 dst host 192.168.31.1 and dst port 80

 

5) 監聽指定網路卡

tcpdump -i eth1

 

6) 監聽指定UDP埠

tcpdump udp port 10888

 

7) 監聽指定TCP埠

tcpdump tcp port 80

 

8) 監聽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 \)

 

9) 監聽A的所有通訊,但不包括A和B的

tcpdump ip A and not B

 

10) 監聽A發出的所有包

tcpdump -i eth1 src host A

 

11) 監聽所有傳送到B的包

tcpdump -i eth1 dst host B

 

12) 監聽A收到或發出的所有http包

tcpdump tcp port 80 and host A

 

13) 列出tcpdump能夠監聽的網路卡

tcpdump -D

 

14) 監聽所有網路卡,要求2.2或更高版本核心

tcpdump -i any

 

15) 詳細顯示捕獲的資訊

tcpdump -v

 

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

 

16) 以十六進位制和ASCII方式列印包,除了連線層頭

tcpdump -v -X

 

17) 以十六進位制和ASCII方式列印包,包括連線層頭

tcpdump -v -XX

 

18) 限制捕獲100個包

tcpdump -c 100

 

19) 將記錄寫入檔案

tcpdump -w filename.log

 

20) 使用IP代替域名

tcpdump -n

 

21) 捕獲每個包的100位元組而不是預設的68位元組

tcpdump -s 500

 

如果要捕獲所有位元組則為:tcpdump -s 0。

 

22) 捕獲所有廣播或多播包

tcpdump -n "broadcast or multicast"

 

23) 捕獲所有icmp和arp包

tcpdump -v "icmp or arp"

 

24) 捕獲arp包

tcpdump -v arp

 

25) 捕獲目標地址是192.168.0.1,埠是80或443的包

tcpdump -n "dst host 192.168.0.1 and (dst port 80 or dst port 443)"

 

26) 捕獲目標埠號在1-1023間的UDP包

tcpdump -n udp dst portrange 1-1023

 

27) 捕獲目標埠號為23的包

tcpdump dst port 23

 

28) 捕獲目標網路為192.168.1.0/24的包

tcpdump -n dst net 192.168.1.0/24

 

29) 捕獲源網路為192.168.1.0/24的包

tcpdump -n src net 192.168.1.0/24

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

8.5. iptraf實時IP區域網監控

8.6. iftop網路頻寬監控

按對端IP檢視網路流量。

8.7. nethogs網路頻寬監控

按程式檢視網路流量:https://github.com/raboof/nethogs/releases

8.8. slurm檢視網路流量工具

8.9. Arpwatch乙太網活動監控器

8.10. Suricata網路安全監控

8.11. Nagios網路/伺服器監控

8.12. socat多功能的網路工具

全稱“Socket CAT”,為netcat的加強版。

8.13. mtr網路連通性判斷工具

整合了traceroute和ping。

8.14. 檢視網路卡統計

ethtool -S eth1

8.15. 檢視網路卡RingBuffer大小

ethtool -g eth1

8.16. 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 顯示所有統計

9. /proc檔案系統

有關/proc的內容很龐大,系統監控需要從這裡讀取大量資料,這裡逐步記錄一些常用到的。

9.1. /proc/meminfo

記憶體大小和使用資訊。

9.2. /proc/cpuinfo

CPU個數和頻率等CPU資訊。

9.3. /proc/PID

程式的各種資訊,其中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

 

包括程式的命令列引數等均可以這個目錄下得到。

9.4. /proc/irq/

1) /proc/irq/

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

2) /proc/irq/[irq_num]/smp_affinity

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

3) /proc/irq/[irq_num]/smp_affinity_list

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

9.5. /proc/net

網路相關的:

1) /proc/net/dev

可用來統計網路卡流量。

2) /proc/net/sockstat SOCKET的各類狀態

9.6. /proc/sys/fs

檔案系統相關:

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

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

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

9.7. /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

9.8. /proc/sys/vm

記憶體相關:

1) /proc/sys/vm/drop_caches

2) /proc/sys/vm/overcommit_memory

10. 其它

10.1. shell中函式繼承問題

我們知道變數是會被子程式繼承的,可以直接使用。有些情況下可能需要繼承函式,以方便透明使用,方法非常簡單,使用“export -f”,注意引數“-f”,它表示函式的意思,不帶引數的export只針對變數。

function ifprop()

{

    echo ":$1=$2"

}

export -f ifprop

 

也可以使用“typeset -fx”替代“export -f”。

10.2. 檢視Linux各發行版本方法

基本上各發行版本均在/etc目錄下有個字尾為“-release”的檔案,該檔案即儲存了發行版本的版本號資訊,如:

1) SuSE

cat /etc/SuSE-release

 

2) Slackware

cat /etc/slackware-version

 

3) Redhat

cat /etc/redhat-release

10.3. 取IP地址命令

netstat -ie|awk /broadcast/'{print $2}'

netstat -ie|awk -F '[ :]+' /cast/'{print $4}'

netstat -ie|awk -F '[ :]+' /cast/'{print $3}'

10.4. 清除系統快取

echo 3 > /proc/sys/vm/drop_caches

 

測試請參見:http://blog.chinaunix.net/uid-20682147-id-4209165.html。

10.5. 檢視TCP資料

cat /proc/net/tcp

10.6. 檢視UDP資料

cat /proc/net/udp

10.7. 檢視socket緩衝區預設大小

cat /proc/sys/net/core/rmem_default

10.8. 檢視socket緩衝區最大大小

cat /proc/sys/net/core/rmem_max

10.9. 找出CPU佔用最高的執行緒

ps -mp 20693 -o THREAD,tid,time | sort -rn

10.10. Linux上查詢造成IO高負載的程式

1) 方法1:使用iotop工具

這是一個python指令碼工具,使用方法如:iotop -o

 

2) 方法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) 方法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

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

10.12. 配置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

 

2) 修改/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。

10.13. crontab使用環境變數

有兩種方式在crontab中定義變數:

1) 直接在crontab中定義變數

A=123

* * * * * echo $A > /tmp/a.txt

 

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

A=123

B=$A

 

2) 在/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有效。

11. 幾種修改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

11.1. 臨時修改主機名

命令hostname不但可以檢視主機名,還可以用它來修改主機名,格式為:hostname 新主機名。

在修改之前9.4.149.11對應的主機名為hadoop_10202,而9.4.149.6對應的主機名為hadoop_10203。兩者的主機名均帶有下劃線,因此需要修改。為求簡單,僅將原下劃線去掉:

hostname hadoop10202

hostname hadoop10203

 

經過上述修改後,類似於修改環境變數,只臨時有效,還需要修改相應的系統配置檔案,以永久有效。

11.2. 永久修改主機名

不同的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

11.3. 區別

方法

效果

hostname

當次登入臨時有效,新登入或重新登入後無效

hostnamectl

系統重啟之前一直有效,重啟後無效

/etc/hostname

只有在系統重啟後才有效

12. 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"

 

2) 示例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。

13. 遠端批量操作工具

遠端批量工具包含:

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

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

引數名

預設值

說明

-u

使用者名稱引數,可用環境變數U替代

-p

密碼引數,可用環境變數P替代

-h

IP列表引數,可用環境變數H替代

-P

22,可修改原始碼,編譯為常用埠號

SSH埠引數,可用環境變數PORT替代

-c

在遠端機器上執行的命令,建議單引號方式指定值,除非要執行的命令本身已經包含了單引號有衝突。使用雙引號時,要注意轉義,否則會被本地shell解釋

-v

1

工具輸出的詳細度

-thr

1

執行緒數,當執行緒數大於2時,併發執行;如果值為0,表示執行緒數和IP數相同

13.2. 批量上傳檔案工具:mooon_upload

引數名

預設值

說明

-u

使用者名稱引數,可用環境變數U替代

-p

密碼引數,可用環境變數P替代

-h

IP列表引數,可用環境變數H替代

-P

22,可修改原始碼,編譯為常用埠號

SSH埠引數,可用環境變數PORT替代

-s

以逗號分隔的,需要上傳的本地檔案列表,可以帶相對或絕對目錄

-d

檔案上傳到遠端機器的目錄,只能為單個目錄

-thr

1

執行緒數,當執行緒數大於2時,併發執行;如果值為0,表示執行緒數和IP數相同

13.3. 使用示例

1) 使用示例1:上傳/etc/hosts

mooon_upload -s=/etc/hosts -d=/etc

2) 使用示例2:檢查/etc/profile檔案是否一致

mooon_ssh -c='md5sum /etc/hosts'

3) 使用示例3:批量檢視crontab

mooon_ssh -c='crontab -l'

4) 使用示例4:批量清空crontab

mooon_ssh -c='rm -f /tmp/crontab.empty;touch /tmp/crontab.empty'

mooon_ssh -c='crontab /tmp/crontab.emtpy'

5) 使用示例5:批量更新crontab

mooon_ssh -c='crontab /tmp/crontab.online'

6) 使用示例6:取遠端機器IP

因為awk用單引號,所以引數“-c”的值不能使用單引號,所以內容需要轉義,相對其它來說要複雜點:

mooon_ssh -c="netstat -ie | awk -F[\\ :]+ 'BEGIN{ok=0;}{if (match(\$0, \"eth1\")) ok=1; if ((1==ok) && match(\$0,\"inet\")) { ok=0; if (7==NF) printf(\"%s\\n\",\$3); else printf(\"%s\\n\",\$4);} }'"

 

不同的環境,IP在“netstat -ie”輸出中的位置稍有不同,所以awk中加了“7==NF”判斷,但仍不一定適用於所有的環境。需要轉義的字元包含:雙引號、美元符和斜槓。

 

7) 使用示例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) 使用示例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

 

相關文章