Linux後臺開發工具箱
https://download.csdn.net/download/aquester/10847097
目錄
4.17. dstat可取代vmstat/iostat/netstat/ifstat的工具 8
4.18. MultiTail類似tail的同時監控多個文件工具 9
7.1. valgrind和qcachegrind記憶體分析工具 13
12. process_monitor.sh程式監控重啟工具 26
13.2. 批量上傳檔案工具:mooon_upload 28
1. 前言
本文是個大雜燴,內容為日常點滴的日積月累,持續更新當中,可關注部落格(https://blog.csdn.net/Aquester或http://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時需要修改主機名,而且主機名不能包含下劃線。
實際上,主機名分三種(命令hostnamectl或hostnamectl 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 |
工具輸出的詳細度 |
1 |
執行緒數,當執行緒數大於2時,併發執行;如果值為0,表示執行緒數和IP數相同 |
13.2. 批量上傳檔案工具:mooon_upload
引數名 |
預設值 |
說明 |
-u |
無 |
使用者名稱引數,可用環境變數U替代 |
-p |
無 |
密碼引數,可用環境變數P替代 |
-h |
無 |
IP列表引數,可用環境變數H替代 |
-P |
22,可修改原始碼,編譯為常用埠號 |
SSH埠引數,可用環境變數PORT替代 |
-s |
無 |
以逗號分隔的,需要上傳的本地檔案列表,可以帶相對或絕對目錄 |
-d |
無 |
檔案上傳到遠端機器的目錄,只能為單個目錄 |
1 |
執行緒數,當執行緒數大於2時,併發執行;如果值為0,表示執行緒數和IP數相同 |
13.3. 使用示例
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”判斷,但仍不一定適用於所有的環境。需要轉義的字元包含:雙引號、美元符和斜槓。
$ 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 |
$ 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 |
相關文章
- 大資料開發-linux後臺執行,關閉,檢視後臺任務大資料Linux
- go微服務開發工具箱Go微服務
- 星雲 Android 開發工具箱Android
- Node + Express 後臺開發 —— 起步Express
- leacmf通用api開發後臺ACMAPI
- EBCMS核心後臺開發框架框架
- React開發管理後臺0React
- Linux後臺執行Linux
- JAVA後臺開發學習(5)Java
- 後臺開發 - DPDK引發的圖譜
- 高顏值!一款基於 Flutter 開發的 Linux 伺服器工具箱FlutterLinux伺服器
- Xcode:Mac上的全功能開發工具箱XCodeMac
- linux殺死後臺程式Linux
- Linux 後臺執行命令Linux
- laravel8 + layui 開發通用後臺LaravelUI
- 微信後臺開發實戰教程
- Java後臺開發學習(3)——MongoDBJavaMongoDB
- React開發管理後臺實踐1React
- 一小時完成後臺開發:DjangoRestFramework開發實踐DjangoRESTFramework
- Linux nohup:後臺不掛起命令(後臺執行命令)Linux
- 基於 Hyperf 開發的前後分離管理後臺
- Node + Express 後臺開發 —— 登入標識Express
- Laravel5.8+Layui敏捷後臺開發框架LaravelUI敏捷框架
- 工業網際網路後臺開發
- 快速開發平臺的幕後意義
- 微信後臺開發作業講解
- Laravel5.5+dingo+JWT 開發後臺 APILaravelGoJWTAPI
- Java後臺開發學習(1)——User介面Java
- 最右APP——招聘golang後臺開發工程師APPGolang工程師
- hubilder如何入後臺java配合開發webapp?JavaWebAPP
- Linux jar包 後臺執行LinuxJAR
- 詳解linux後臺、前臺執行程序Linux行程
- linux後臺執行和關閉、檢視後臺任務Linux
- 一款基於Laravel5.8開發的後臺開發框架Laravel框架
- HarmonyOS 後臺任務管理開發指南上線!
- Django Admin後臺管理:高效開發與實踐Django
- Spring Boot 開發微信公眾號後臺Spring Boot
- Vue後臺管理開發之側邊欄(初稿)Vue