1. 程式人生 > >一些linux shell的問題

一些linux shell的問題

1. root使用者下以httpd使用者的身份執行指令碼/opt/case/www.km.com/testdb.php,用一條命令怎麼實現?

sudo -u httpd  `which php` /opt/case/www.km.com/testdb.php

2. 新增crontab,在11月內,每天的早上6點到20點中,每隔2小時執行一次/opt/shell/rsync.sh?

0 6-20/2 * 11 * /opt/shell/rsync.sh

如果rsync.sh沒有執行權
0 6-20/2 * 11 * /bin/bash /opt/shell/rsync.sh

3. 使用find命令查詢/opt/case/目錄下的內容,一條命令同時滿足以下三個需求:
   a.大於10K以php結尾的檔案;
   b.修改時間為24小時內的;
   c.移動到/opt/src/目錄下。

find /opt/case/ -name "*php" -size +10k -mtime -1 -exec mv {} /opt/src/ \;

如果用兩條命令實現可以用xargs命令
find /opt/case/ -name "*php" -size +10k -mtime -1 | xargs -i mv {} /opt/src/


4. 如何檢視程序號為4044的程序打開了哪些檔案?

lsof -p 4044

5. 通過nginx訪問access.log紡計每個IP地址訪問的次數,按訪問量列出前10名.
日誌格式樣例如下:
172.16.0.11 -- [22/Nov/2016:14:00:00 +0800] "GET / HTTP/1.1" 200 231 "-" "-"

awk '{print $1}' access.log| sort |uniq -c | sort -rn | head -n10

6. 假設nginx產生的日誌檔名為access_log,在nginx正在執行時,執行命令mv access_log access_log.bak,執行完後,請問新的nginx日誌會出到哪裡,為什麼?

新的nginx日誌會出到access_log.bak,因為nginx還持有舊檔案的控制代碼,還是指向access_log.bak,只有重新載入nginx後才會生成新的access_log檔案.

 
7. MySQL怎麼授權及取消授權, 假如環境如下:

授權IP: 172.16.0.11
使用者名稱: test
密碼: 123456
資料庫名稱: monitor
許可權: SELECT
grant select on monitor.* to 'test'@'172.16.0.11' identified by '123456'
revoke select on monitor.* from 'root'@'172.16.0.11'

REVOKE語句只能取消使用者的許可權,而不可以刪除使用者。即使取消了所有的許可權,使用者仍然可以連線到伺服器。要想徹底的刪除使用者,必須使用DELETE語句將該使用者的記錄從MySQL資料庫中的user表中刪除。該語句的語法格式如下: 
Delete from user where user = "user_name" and host = "host_name" ;

8. 用for迴圈輸出20以下的偶數

for ((i=0;i<20;i=i+2));do echo $i; done 或者

for i in {0..20..2}; do echo $i; done

9. 一個每天pv億級的大型web網站,必要的架構有哪些,說出你理解


10. linux怎麼檢視使用者登入日誌

more /var/log/secure
who /var/log/wtmp 或者last

11. linux中utmp,wtmp,lastlog,message各檔案的作用

/var/run/utmp檔案,它記錄當前登入進系統的各個使用者

w命令查詢utmp檔案並顯示當前系統中每個使用者和它所執行的程序資訊
who命令查詢utmp檔案並報告當前登入的每個使用者

/var/log/wtmp 記錄每個使用者的登入次數和持續時間等資訊。
who /var/log/wtmp 或者last檢視

/var/log/lastlog檔案記錄系統中所有使用者最近一次登入資訊
可以使用lastlog命令輸出lastlog檔案的內容

/var/log/messages
messages 日誌是核心系統日誌檔案。它包含了系統啟動時的引導訊息,以及系統執行時的其他狀態訊息。IO 錯誤、網路錯誤和其他系統錯誤都會記錄到這個檔案中。其他資訊,比如某個人的身份切換為 root,也在這裡列出。
此外,mail,cron,daemon,kern和auth等內容也記錄在var/log/messages日誌中。
如果服務正在執行,比如 DHCP 伺服器,您可以在 messages 檔案中觀察它的活動。通常,/var/log/messages 是您在做故障診斷時首先要檢視的檔案。

12. 列舉你熟悉的伺服器效能檢視命令
w;uptime; top; free -m;netstat;vmstat;sar;dmesg;pidstat;mpstat

13. linux伺服器怎麼實現無密碼登陸.列舉操作步驟

用 ssh-key-gen 在本地主機上建立公鑰和金鑰
ssh-keygen -t rsa
用 ssh-copy-id 把公鑰複製到遠端主機上
 ssh-copy-id -i ~/.ssh/id_rsa.pub  [email protected]
(也可以用scp id_rsa.pub 192.168.1.1:/root/.ssh/authorized_key 命令複製)

設定目錄和檔案許可權
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys

直接登入遠端主機
ssh 192.168.1.1

14. 使用tcpdump嗅探80埠的訪問看看誰最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F "." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head

15. 檢視當前系統每個ip的連線數
netstat -np | awk '/tcp/ {print $5}' | awk -F: '{print $1}'| sort|uniq -c | sort -rn

統計80埠連線數
netstat -nat|grep -i "80"|wc -l

16. 請寫出iptables語句      iptables [-t 表名] -命令 -匹配 -j 動作/目標   

1)本地80埠的請求轉發到遠端伺服器10.0.3.188:8080埠,當前主機IP為192.168.2.1,並且保證服務正常使用  

2)允許本機對外連線80埠(本機能連外界伺服器為80) 

3)開放本機的3306埠

4)禁止外界ping本伺服器

解答:
1.iptables -t nat -A PREROUTING -p tcp -d 192.168.2.1 --dport 80 -j DNAT --to-destination 10.0.3.188:8080
2.iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT
3.iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
4.iptables -A INPUT -p icmp -j DROP

19. 通過proc 檔案系統怎麼找到id 為235的程序檔案在哪個位置,打開了哪些檔案,啟動引數是什麼,他的父程序id 是多少,他的子程序id 有哪些?

通過訪問這些檔案和資料夾,我們可以實時查詢到當前系統的執行資訊:程序檔案在/proc/235/目錄中

看程序打開了哪些檔案: ls -l /proc/235/fd/
啟動引數: cat /proc/235/cmdline

cat status | grep  -E 'Tgid|Pid|PPid'

#pid 程序號, ppid 父程序號, tgid程序組號

20.有個檔案file1如下:
http://a.domain.com/1.html
http://b.domain.com/1.html
http://c.domain.com/1.html
http://a.domain.com/2.html
http://b.domain.com/2.html
http://a.domain.com/3.html

請寫出命令或指令碼得出以下結果:
      3 a.domain.com
      2 b.domain.com
      1 c.domain.com

awk -F'/' '{print $3}' file1 |sort |uniq -c

21.在linux系統中,我們通常使用終端shell指令碼處理一些資料,十分高效現在有以下兩個檔案:
file1:
user passwd
aa   1234
bb    4567
cc   9999

file2:
id user
001 cfoqe
002 werwe
003 cc
004 jggq

22. 寫一段shell指令碼,輸出同時存在於file1和file2中使用者名稱的密碼
awk 'NR==FNR{a[$1]=$2;next}{print a[$2]}' file1 file2|sed '/^$/d'
注:sed用於刪除空行,可不用

23. 寫一個指令碼後臺監控php-fpm程序,當檢測到程序停止後,能自動啟動php-fpm

#!/bin/bash
#變數初始化
process="php-fpm" #程序名
startCmd="/etc/init.d/php-fpm start" #啟動命令
down=0
while true
do
    #取得http狀態碼
    code=$(curl -H "Host:www.jb51.net" -m 5 -L -s -w %{http_code} http://127.0.0.1 -o /dev/null)
    #當狀態碼返回000或者大於等於500時,計數故障到down變數
    if [ $code -eq 000 -o $code -ge 500 ];then
        ((down++))
    else
break
    fi
    #稍等5s
    sleep 5
    #判斷是否連續檢測三次都為故障.
    if [ $down -ge 3 ];then
if [ "$(find /tmp/${process}_restart -mmin -3)" == "" ];then
                #取得程序名對應的所有pid
pids=$(ps aux | grep ${process} | grep -v "grep" | awk '{print $2}')
                #依次對所有pid執行kill命令
for i in $pids;do
kill -9 $i
kill -9 $i
done
                #kill完pid後,啟動服務
$startCmd
echo "$(date) Return code $code,${process} had been restarted" >> /tmp/${process}_restart
else
echo "$(date) ${process} not yet recovery.As it had been restarted in 2 minutes.so this time ignore." >> /tmp/${process}_not_restart
fi
break
    fi
done


24. 寫一個指令碼,實現判斷10.10.1.0/24網路裡,當前線上的IP有哪些,能ping通認為線上

#!/bin/bash
    for ip in {1..255}
    do
    {
        ping -c 1 10.10.1.$ip > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo 10.10.1.$ip UP
        else
            echo 10.10.1.$ip DOWN
        fi
    }&
    done
    wait

不使用指令碼,用一行命令實現:
nmap -sP 10.10.1.0/24

25. 寫一個指令碼,如果有錯誤,則提醒使用者鍵入Q或者q無視錯誤並退出。其他任何輸入都可以通過vim開啟這個指定的指令碼

#!/bin/bash
read -p "請輸入指定指令碼檔案:" file
if [ -f $file ]; then
    bash -n $file > /dev/null 2>&1
    if [ $? -ne 0 ];then
        read -p "指令碼檔案$file語法錯誤,按Q或q退出,其它鍵開啟vim:" answer
        case $answer in
        q | Q)
        exit 0
        ;;
        *)
        vim $file
        exit 0
        ;;
        esac
    else
        echo  "指令碼檔案$file語法正確."
    fi
else
    echo "指令碼文$file不存在"
    exit 1
fi


26. 從第1000行開始,顯示2000行。即顯示1000~2999行
cat input_file | tail -n +1000 | head -n 2000


顯示 1000行到3000行
cat input_file | head -n 3000 | tail -n +1000


顯示最後1000行
tail -n 1000

從1000行開始顯示,顯示1000行以後的
tail -n +1000

顯示前面1000行
head -n 1000 input_file
或者
sed '1000q' input_file

檢視檔案的第5行到第10行
sed -n '5,10p' input_file

顯示前10行
sed '10q' input_file

用awk處理,顯示2-11行
awk 'NR==2, NR==11{print}'  input_file
或者
awk 'NR>=2 && NR<=11 {print $0}' input_file

27. 有一日誌檔案(假設檔名為 demo.log ),只檢視它的第1000至2000 行(方法不限)
tail -n +1000 demo.log | head -n 10001 或者
sed -n '1000,2000p' demo.log

28. Nginx二進位制原始碼包在搜狐映象的URL是http://mirrors.sohu.com/nginx/,如何通過管道來獲取nginx的最新版本號?
curl -s http://mirrors.sohu.com/nginx/|sed -n 's/<a href=.*\(nginx-.*.tar.gz\)<\/a> .*/\1/p'|sort -t. -nr -k2.2 -k3.2|head -1

29. Nginx伺服器報 "Too Many Open Files" 一般是什麼狀況引起的,該如何處理?

1)應用級別:修改nginx的配置檔案  新增work_rlimit_nofile=65535


2)系統級別:修改etc/security/limits.conf中軟限制和硬限制數。


* soft nofile 10240

* hard nofile 15360

其中第一行soft表示所有使用者開啟檔案的數量限制為10240,如果超過這個數字則提示警告資訊,但是依然可以開啟檔案。

第二行hard表示最大的開啟檔案數量不能超過15360,如果超過這個數字,則無法開啟檔案。


這裡也可以針對具體的使用者或者使用者組進行相應的設定。例如針對nginx這個使用者進行設定:


nginx soft nofile 10240

nginx hard nofile 15360

3)核心級別:首先檢視核心級別允許開啟檔案的上限,cat /proc/sys/fs/file-max 或者sysctl -n  fs.file-max 這個值預設其實是蠻大的,可以無需調節。


如果需要調整,可以編輯/etc/sysctl.conf這個檔案。

$ vi /etc/sysctl.conf

加上fs.file-max設定


fs.file-max = 100000

然後重新載入核心配置

$ sysctl -p

30. 如果讓你管理數量 100+ 伺服器,你會如何去管理?
1)首先將100+臺伺服器都錄入到資產管理系統中,並且使用zabbix新增監控、設定郵件報警。
2)將100+臺機器按照業務分組,比如資料庫、測試等。
3)使用自動化管理工具ansible進行批量管理。

31. 用shell模擬從一幅撲克牌中隨機抽取1張牌(Tips: 有個內建函式 RANDOM,可根據指定的資料範圍隨機生成資料)

suites=(Clubs Dianonds Hearts Spades Joker)
deno=(2 3 4 5 6 7 8 9 10 Jack Queen King Ace)
var=(red black)
num_suites=${#suites[@]}
num_deno=${#deno[@]}
num_var=${#var[@]}
var1=$((RANDOM%$num_suites))
if [ "${suites[$var1]}" == "Joker" ];then
    echo " Joker of "
    echo ${var[$((RANDOM%$num_var))]}
else
    echo "${deno[$((RANDOM%$num_deno))]} of "
    echo ${suites[$var1]}
fi

32. 用什麼命令查詢指定ip地址的伺服器埠
比如掃描192.168.1.1的目標機是否開啟80web服務、21ftp服務,23telnet服務,則可以執行:
nmap -p80,21,23 192.168.1.1
nc -nv 192.168.1.1 80
nc -nv -z -w2 192.168.1.1 80-90 (掃描多個埠,w2表示超時時間為2秒)


33. -exec和xargs的區別
find -exec 命令會對每個匹配的檔案執行一個單獨的rm操作,但是使用這種方式,如果有100個檔案匹配了,那麼就需要啟100個程序,一個程序處理一個rm命令。一般來說,其越多程序,意味著越耗效能。

xargs 一次將引數傳給命令,可以使用-n控制引數個數,xargs不能操作檔名有空格的檔案

34. /var/www/html/是網站的釋出目錄,如何每天凌晨0點30對其進行自動備份?
a、crontab-e進入編輯模式
b、新增以下內容
30 0 * * * /bin/tar -czf /backup/web_bak_$(date+\%Y\%m\%d).tar.gz /var/www/html>/dev/null2>&1
c、啟動服務service crontab start;chkconfig crontab on

35. Yum命令與rpm命令的區別?如何使用rpm安裝一個有依賴的包?

rpm一般用於安裝本地的包,yum一般用於線上安裝(也可以本地光碟建立yum源)
最大的區別在於yum可以自動安裝所依賴的包(不包含環境)

36. 簡述raid0raid1raid5三種工作模式的工作原理及特點。

raid0數量>=2磁碟利用率100%hot-spare無優點讀寫效能高缺點沒有容錯能力

    資料分散寫入不同磁碟,不提供冗餘,不能擴容,任何一個盤壞掉,資料全部丟失。適用於對效能要求高,但對資料的安全不太在乎的領域。

    raid1數量>=2磁碟利用率50%Hot-spare有優點提供資料冗餘,安全性高缺點浪費磁碟空間

    適用於對資料安全性高的場所,一般為2塊盤,空間為最小的盤的空間,如果有4塊盤,其中3塊空間都是浪費(做映象冗餘)只要有一塊盤存在,資料就不會丟失.

    raid5數量>=3磁碟利用率(n-1)/nhot-spare有優點有容錯,可冗餘,讀取效能高缺點寫效能低

    raid5相當於raid0和raid1的折中方案

    應用伺服器(像apache)做raid1兩塊硬碟

    資料伺服器(像Mysql)做raid10四塊硬碟

37. 如何檢視佔用埠8080的程序。

   netstat-anlp|grep8080

    lsof-i:8080

38. 寫一個指令碼將資料庫備份並打包至遠端伺服器192.168.1.1 /backup目錄下。
mount 192.168.1.1:/backup /mnt
cd /mnt
/usr/local/mysql/bin/mysqldump -hlocalhost -uroot test >test.sql
tar czf test.sql.tar.gz test.sql
rm -f test.sql

39.寫一個防火牆配置指令碼,只允許遠端主機訪問本機的80埠。
iptables -F
iptables -X
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -P INPUT DROP

38.寫出下列命令的含義
 (1)MaxKeepAliveRequests    100  連線的最大請求數
 (2)Options FollowSymLinks  允許192.168.1.1可以列目錄
               Order Deny Allow
                Deny from all
         Allow from 192.168.1.1

40. 替換檔案中的目錄
sed 's:/user/local:/tmp:g'  filename

41. 把test.txt檔案23行test改成tset
sed '23s/test/tset/g' test.txt


42. 簡要描述Linux的啟動過程?
1.載入BIOS 2.讀取MBR 3.Boot Loader 4.載入核心 5.使用者層init依據inittab檔案來設定系統執行等級 6.init程序執行rc.syninit
7.啟動核心模組 8.執行不同級別執行的指令碼程式 9.執行/etc/rc.d/rc.local 10.執行/bin/login程式,進入登入狀態.


43. 簡要敘述下列埠所執行的服務
21、 22、 23、 25、 110、 143、 873、 3306

ftp、ssh、telnet、 smtp、pop3、IMAP、rsync、mysql

44. TCP斷頭最小長度是? 64位元組

45. 讓某普通使用者能進行cp /dir1/file1 /dir2的命令時,請說明dir1 file1 dir2最小具有什麼許可權?
dir1 :至少需要有 x 許可權;
file1:至少需要有 r 許可權;
dir2 :至少需要有 w, x 許可權。

46. 簡述TCP三次握手的過程?
第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;

第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;

第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。

47. 使用tcpdump監聽主機IP為192.168.1.1,tcp埠為80的資料,同時將結果儲存輸出到tcpdump.log
tcpdump -nn host 192.168.1.1 and tcp port 80 -s0 -t -w tcpdump.log

引數說明
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個引數的位置,用來過濾資料報的型別
(2)-i eth1 : 只抓經過介面eth1的包
(3)-t : 不顯示時間戳
(4)-s 0 : 抓取資料包時預設抓取長度為68位元組。加上-S 0 後可以抓到完整的資料包
(5)-c 100 : 只抓取100個數據包
(6)dst port ! 22 : 不抓取目標埠是22的資料包
(7)src net 192.168.1.0/24 : 資料包的源網路地址為192.168.1.0/24
(8)-w ./target.cap : 儲存成cap檔案,方便用ethereal(即wireshark)分析

48. linux如何掛載windows下的共享目錄

mount -t cifs -o username="共享使用者",password="密碼" //ip/共享目錄 /mnt

49. 在linux主機只允許遠端主機訪問80埠,通過iptables實現
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p icmp -j DROP

iptables -F 清空規則
iptables -X 刪除使用者自定義的鏈
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -P INPUT DROP 設定預設策略的

50. 6塊300G硬碟做raid 5,請問實際在作業系統中可用磁碟多大?
磁碟空間x(n-1) =300Gx(6-1) =1800G

51. 通過nestat命令找出apache執行的pid
netstat -tlnp |grep httpd

52.說明linux命令中-exec和xargs的區別
exec命令的格式為: exec command {} \;
有些系統對傳遞給exec的命令長度有限制,會出現溢位錯誤。
execexec命令將為每一個引數單獨執行一條命令,效率低
而xargs是將所有的引數傳遞給命令,只有一個程序。 
引數中不能有空格

53. 統計目錄A中所有.svn資料夾合計佔用磁碟大小
find a -name ".svn" |xargs du -h -c .svn

54.將資料夾A中1個小時內產生的字尾為.php的檔案刪除
find a -name "*.php" -mmin -60 | xargs -i rm {}


55. 統計access.log某個時間點產生的總流量
cat access.log |awk '{if (match($4,"07/Mar/2017:05:24:49")) ;sum+=$10} END {print sum}'
07/Mar/2017:05:24:49

56. crontab誤刪了,如何恢復
/var/log/cron

0 0 * * * * /usr/bin/crontab -l>/backup/crontab`date '+%Y%m%d'`.bak

mysql題

1.mysql主從延遲原因以及解決方案 

原因:當主庫的TPS併發較高時,產生的DDL數量超過slave一個sql執行緒所能承受的範圍,那麼延時就產生了,當然還有就是可能與slave的大型query語句產生了鎖等待。

解決方案:
在架構上做優化,儘量讓主庫的DDL快速執行。


主庫是寫,對資料安全性較高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之類的設定,而slave則不需要這麼高的資料安全,完全可以講sync_binlog設定為0或者關閉binlog,innodb_flushlog也可以設定為0來提高sql的執行效率。

選擇支援多執行緒的mysql版本來進行主從複製,避免併發高峰時可能的延遲,mysql-5.6.3已經支援了多執行緒的主從複製。


使用比主庫更好的硬體裝置作為slave。


MySQL資料庫主從同步延遲產生的因素。 
1. 網路延遲 
2. master負載 
3. slave負載 
 一般的做法是,使用多臺slave來分攤讀請求,再從這些slave中取一臺專用的伺服器,只作為備份用,不進行其他任何操作,就能相對最大限度地達到’實時’的要求了


2.簡述儲存引擎Myisam和Innodb的區別與應用場景

MyISAM
  它不支援事務,也不支援外來鍵,尤其是訪問速度快,對事務完整性沒有要求或者以SELECT、INSERT為主的應用基本都可以使用這個引擎來建立表

InnoDB儲存引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比MyISAM的儲存引擎,InnoDB寫的處理效率差一些並且會佔用更多的磁碟空間以保留資料和索引。


兩種儲存引擎的大致區別表現在:
1)InnoDB支援事務,MyISAM不支援,這一點是非常之重要。事務是一種高階的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而MyISAM就不可以了。
2)MyISAM適合查詢以及插入為主的應用,InnoDB適合頻繁修改以及涉及到安全性較高的應用
3)InnoDB支援外來鍵,MyISAM不支援
4)從MySQL5.5.5以後,InnoDB是預設引擎
5)InnoDB不支援FULLTEXT型別的索引
6)InnoDB中不儲存表的行數,如select count(*) from table時,InnoDB需要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出儲存好的行數即可。注意的是,當count(*)語句包含where條件時MyISAM也需要掃描整個表
7)對於自增長的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM表中可以和其他欄位一起建立聯合索引
8)清空整個表時,InnoDB是一行一行的刪除,效率非常慢。MyISAM則會重建表
9)InnoDB支援行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%'

關於MyISAM與InnoDB選擇使用:
MYISAM和INNODB是Mysql資料庫提供的兩種儲存引擎。兩者的優劣可謂是各有千秋。INNODB會支援一些關係資料庫的高階功能,如事務功能和行級鎖,MYISAM不支援。MYISAM的效能更優,佔用的儲存空間少。所以,選擇何種儲存引擎,視具體應用而定:

1)如果你的應用程式一定要使用事務,毫無疑問你要選擇INNODB引擎。但要注意,INNODB的行級鎖是有條件的。在where條件沒有使用主鍵時,照樣會鎖全表。比如DELETE FROM mytable這樣的刪除語句。

2)如果你的應用程式對查詢效能要求較高,就要使用MYISAM了。MYISAM索引和資料是分開的,而且其索引是壓縮的,可以更好地利用記憶體。所以它的查詢效能明顯優於INNODB。壓縮後的索引也能節約一些磁碟空間。MYISAM擁有全文索引的功能,這可以極大地優化LIKE查詢的效率。

3.mysql高可用方案有哪些?mysql備份方案有哪些?有什麼優缺點
Keepalived+MySQL Replication
MySQL架構為主從形式,當master故障時,會自動切換到slave上.
Keepalived的作用是檢測MySQL伺服器狀態,如果有一臺MySQL伺服器出現故障後將其剔除,當故障恢復後,自動將伺服器加入叢集中。

Heartbeat+DRBD+MySQL
Heartbeat可實現心跳監測和資源接管
DRBD是一個用軟體實現的、無共享的、伺服器之間映象塊裝置內容的儲存複製解決方案。
當master出現故障,VIP就會漂移到slave上,DRBD分割槽會自動掛載。

MMM(Master-Master Replication Manager for MySQL)主主複製管理器,是一套提供了MySQL主主複製配置的監控、故障遷移和管理的可伸縮的指令碼程式。在MMM高可用解決方案中,可以配置雙主多從架構,通過MySQL Replication技術可以實現兩臺MySQL伺服器互為主從,並且在任何時候只有一個節點可以寫入,避免多節點寫入的資料衝突,同時,當可寫節點故障時,MMM套件可以立即監控到,然後將服務自動切換到另一個主節點繼續提供服務,從而實現MySQL的高可用。
簡而言之,通過MMM可以實現監控和管理MySQL主主複製和服務狀態,同時也可以監控多個Slave節點的複製和執行狀態,並且可以做到任意節點發生故障時實現自動切換的功能。MMM也為MySQL提供了讀、寫分離架構的良好平臺。


邏輯備份:mysqldump

優點:

1、恢復簡單,可以使用管道將他們輸入到MySQL

2、與儲存引擎無關,因為是從MySQL伺服器中提取資料而生成的,所以消除了底層資料儲存的不同

3、有助於避免資料損壞。若磁碟驅動器有故障而要複製原始檔案時,此時將得到一個損壞的備份

缺點:

1、  必須有資料庫伺服器完成邏輯工作,需要更多地cpu週期

2、  邏輯備份還原速度慢:需要MySQL載入和解釋語句、轉化儲存格式、重建引擎

物理備份:xtrabackup

優點:

1、  基於檔案的物理備份

2、  容易跨平臺、跨作業系統和MySQL版本

3、  恢復起來會更快(不需要執行任何的mysql語句,不需要構建索引,innoDB表無需完全快取到記憶體)

缺點:

1、  檔案大

2、  不總是可以跨平臺、作業系統和MySQL版本

binlog備份

應用場景
對於一些由於錯誤操作等造成資料丟失錯誤的,需要按照時間點進行還原的情況下。

備份時間及地點
備份伺服器實時將主庫上binlog同步到遠端伺服器上

1、Linux 系統的開機啟動順序,以及核心Linux 裁剪的意義。

BGP是自治系統間的路由協議,BGP交換的網路可達性資訊提供了足夠的資訊來檢測路由迴路並根據效能優先和策略約束對路由進行決策
3、簡述BGP 的優點

BGP機房就是伺服器租用商通過技術的手段,實際不同運營商能共同訪問一個IP,並且不同運營商之間都能達到最快的接入速度的相關網路技術

https://baike.baidu.com/item/BGP%E8%B7%AF%E7%94%B1%E5%8D%8F%E8%AE%AE/7640427?fr=aladdin
4、??網路專線就是??網路服務提供商給?使用者提供專?用的通道,讓?使用者的資料傳輸變得可靠可信,專線的
優點就是安全性好, QoS 可以得到保證。不過,專線租?用價格也相對?比較?高,?而且管理也需要專業
?人員。
簡述專線主要有兩種通道,主要是(物理專用通道 )通道和(虛擬專用通道 )通道,如果現在要搭建北京公司到??廣
東分公司的??網路專線,請在不考慮成本的情況下,做出?一套專?用??網路的?方案。要求?至少包含實現的
思路和簡單拓撲結構。
5、簡述VXLAN 的原理

VXLAN 全稱是 Virtual eXtensible Local Area Network,虛擬可擴充套件的區域網。它是一種 overlay 技術,通過三層的網路來搭建虛擬的二層網路
6、軟體定義 ??網路S(oftware Defined Network, SDN ),是由美國斯坦福 ?大cle學an slate 研究
組提出的?一種新型??網路創新架構,其核?心技術OpenFlow 通過將??網路裝置控制?面與資料?面分離開
來,從?而實現了??網路流量的靈活控制,為核?心??網路及應?用的創新提供了良好的平臺。
?xml version="1.0" encoding="UTF-8" standalone="no"?
請簡述你瞭解的SDN 技術是什麼,為了解決什麼問題?

是由Emulex提出的一種新型網路創新架構,其核心技術OpenFlow通過將網路裝置控制面與資料面分離開來,從而實現了網路流量的靈活控制,為核心網路及應用的創新提供了良好的平臺
7、通過proc ?檔案系統怎麼找到id 為235的程序?檔案在那個位置,打開了哪些?檔案,啟動
引數是什麼,他的?父程序id 是多少,他的?子程序id 有哪些?

我們先了解/proc檔案系統中的內容
/proc檔案系統下的多種檔案提供的系統資訊不是針對某個特定程序的,而是能夠在整個系統範圍的上下文中使用。可以使用的檔案隨系統配置的變化而變化。命令procinfo能夠顯示基於其中某些檔案的多種系統資訊。以下詳細描述/proc下的檔案。
--------------------------------------------------------------------------------
/proc/cmdline檔案
這個檔案給出了核心啟動的命令列。它和用於程序的cmdline項非常相似。
--------------------------------------------------------------------------------
/proc/cpuinfo檔案
這 個檔案提供了有關係統CPU的多種資訊。這些資訊是從核心裡對CPU的測試程式碼中得到的。檔案列出了CPU的普通型號(386,486,586,686 等),以及能得到的更多特定資訊(製造商,型號和版本)。檔案還包含了以bogomips表示的處理器速度,而且如果檢測到CPU的多種特性或者bug, 檔案還會包含相應的標誌。這個檔案的格式為:檔案由多行構成,每行包括一個域名稱,一個冒號和一個值。
--------------------------------------------------------------------------------
/proc/devices檔案
這個檔案列出字元和塊裝置的主裝置號,以及分配到這些裝置號的裝置名稱。
--------------------------------------------------------------------------------
/proc/dma檔案
這個檔案列出由驅動程式保留的DMA通道和保留它們的驅動程式名稱。casade項供用於把次DMA控制器從主控制器分出的DMA行所使用;這一行不能用於其它用途。
--------------------------------------------------------------------------------
/proc/filesystems檔案
這個檔案列出可供使用的檔案系統型別,一種型別一行。雖然它們通常是編入核心的檔案系統型別,但該檔案還可以包含可載入的核心模組加入的其它檔案系統型別。
--------------------------------------------------------------------------------
/proc/interrupts檔案
這 個檔案的每一行都有一個保留的中斷。每行中的域有:中斷號,本行中斷的發生次數,可能帶有一個加號的域(SA_INTERRUPT標誌設定),以及登記這 箇中斷的驅動程式的名字。可以在安裝新硬體前,像檢視/proc/dma和/proc/ioports一樣用cat命令手工檢視手頭的這個檔案。這幾個文 件列出了當前投入使用的資源(但是不包括那些沒有載入驅動程式的硬體所使用的資源)。
--------------------------------------------------------------------------------
/proc/ioports檔案
這個檔案列出了諸如磁碟驅動器,乙太網卡和音效卡裝置等多種裝置驅動程式登記的許多I/O埠範圍。
--------------------------------------------------------------------------------
/proc/kcore檔案
這個檔案是系統的實體記憶體以core檔案格式儲存的檔案。例如,GDB能用它考察核心的資料結構。它不是純文字,而是/proc目錄下為數不多的幾個二進位制格式的項之一。
-------------------------------------------------------------------------------
/proc/kmsg檔案
這個檔案用於檢索用printk生成的核心訊息。任何時刻只能有一個具有超級使用者許可權的程序可以讀取這個檔案。也可以用系統呼叫syslog檢索這些訊息。通常使用工具dmesg或守護程序klogd檢索這些訊息。
--------------------------------------------------------------------------------
/proc/ksyms檔案
這個檔案列出了已經登記的核心符號;這些符號給出了變數或函式的地址。每行給出一個符號的地址,符號名稱以及登記這個符號的模組。程式ksyms,insmod和kmod使用這個檔案。它還列出了正在執行的任務數,總任務數和最後分配的PID。
--------------------------------------------------------------------------------
/proc/loadavg檔案
這個檔案給出以幾個不同的時間間隔計算的系統平均負載,這就如同uptime命令顯示的結果那樣。前三個數字是平均負載。這是通過計算過去1分鐘,5分鐘,15分鐘裡執行佇列中的平均任務數得到的。隨後是正在執行的任務數和總任務數。最後是上次使用的程序號。
--------------------------------------------------------------------------------
/proc/locks檔案
這個檔案包含在開啟的檔案上的加鎖資訊。檔案中的每一行描述了特定檔案和文件上的加鎖資訊以及對檔案施加的鎖的型別。核心也可以需要時對檔案施加強制性鎖。
--------------------------------------------------------------------------------
/proc/mdstat檔案
這個檔案包含了由md裝置驅動程式控制的RAID裝置資訊。
--------------------------------------------------------------------------------
/proc/meminfo檔案
這個檔案給出了記憶體狀態的資訊。它顯示出系統中空閒記憶體,已用實體記憶體和交換記憶體的總量。它還顯示出核心使用的共享記憶體和緩衝區總量。這些資訊的格式和free命令顯示的結果類似。
--------------------------------------------------------------------------------
/proc/misc檔案
這個檔案報告用核心函式misc_register登記的裝置驅動程式。
--------------------------------------------------------------------------------
/proc/modules檔案
這個檔案給出可載入核心模組的資訊。lsmod程式用這些資訊顯示有關模組的名稱,大小,使用數目方面的資訊。
--------------------------------------------------------------------------------
/proc/mounts檔案
這個檔案以/etc/mtab檔案的格式給出當前系統所安裝的檔案系統資訊。這個檔案也能反映出任何手工安裝從而在/etc/mtab檔案中沒有包含的檔案系統。
--------------------------------------------------------------------------------
/proc/pci檔案
這個檔案給出PCI裝置的資訊。用它可以方便地診斷PCI問題。你可以從這個檔案中檢索到的資訊包括諸如IDE介面或USB控制器這樣的裝置,匯流排,裝置和功能編號,裝置延遲以及IRQ編號。
--------------------------------------------------------------------------------
/proc/stat檔案
這個檔案包含的資訊有CPU利用率,磁碟,記憶體頁,記憶體對換,全部中斷,接觸開關以及賞賜自舉時間(自1970年1月1日起的秒數)。
--------------------------------------------------------------------------------
/proc/uptime檔案
這個檔案給出自從上次系統自舉以來的秒數,以及其中有多少秒處於空閒。這主要供uptime程式使用。比較這兩個數字能夠告訴你長期來看CPU週期浪費的比例。
--------------------------------------------------------------------------------
/proc/version檔案
這個檔案只有一行內容,說明正在執行的核心版本。可以用標準的程式設計方法進行分析獲得所需的系統資訊。
--------------------------------------------------------------------------------
/proc/net子目錄
此目錄下的檔案描述或修改了聯網程式碼的行為。可以通過使用arp,netstat,route和ipfwadm命令設定或查詢這些特殊檔案中的許多檔案。
位置:

[[email protected] 1]# pwd
/proc/1
開啟的檔案:

[[email protected] 1]# lsof -p 1
COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
init      1 root  cwd    DIR              253,0     4096      2 /
init      1 root  rtd    DIR              253,0     4096      2 /
init      1 root  txt    REG              253,0   150352 261703 /sbin/init
init      1 root  mem    REG              253,0    65928 392482 /lib64/libnss_files-2.12.so
擴充套件一下:顯示某個目錄所有開啟的檔案:
lsof +目錄

啟動引數:

 

[[email protected] 1]# cat cmdline
/sbin/init[[email protected] 1]# 
 

他的父程序id 是多少,他的子程序id

 

[[email protected] proc]#  cat /proc/1/status | grep -E *id

#pid 程序號, ppid 父程序號, tgid程序組號


8、請寫出iptables 語句 iptables [-t 表名] - 命令-匹配-j 動作/ ??目標
1)本地80端?口的請求轉發到遠端伺服器10.0.3.188:8080 端?口,當前主機IP為
192.168.2. ,並且保證服務正常使?用
2)允許本機對外連線80端?口(本機能連外界伺服器為80)
3)開放本機的3306端?口
4)禁?止外界ping 本伺服器

1.[[email protected] ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.2.1 --dport 80 -j DNAT --to-destination 10.0.3.188:8080
2.iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT
3.iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
4.iptables -A INPUT -p icmp -j DROP

9、在時間維度上控制多個myget 下載程序的總下載速度,其中myget 是一個下載命令, 由
sourceforge 上軟體myget 提供,它的常用選項如下:
◆-d [目錄]:指定下載到的?檔案在本地存放的位置,預設當前??目錄。
◆-f [ 檔案]:指定下載?檔名稱。
◆-h:幫助選項。
◆-n [執行緒數]:下載執行緒數量,預設為4個。
程式說明: (1) 語言不限, 但要簡潔, 思路清晰
(2) 儘量使用語言的高階語法
(3)展現程式設計的技巧與藝術,有想象力,例如”第二列的速率可以為0”, 怎麼理解這
句話這不是題意不清,而是考查實力與想象力.
(4) 因為程式需長時間執行, 所以儘量以demon 形式實現(不是必須)
(5) 限速方法不限, 例如tc
程式需有三個可配置的?檔案:
(1)d.conf: 主配置?檔案,對於max_, mini_ 的解釋, 請看第三個配置?檔案的解釋;
max_1=1g # 對應dlimit.conf 中的$1上限值
mini_1=100m # 對應dlimit.conf 中的$1 下限值
max_2=1000m
mini_2=100m
max_3=500k
mini_3=100k
threads=199 # 下載的執行緒數, myget 此引數配置裡面的執行緒數; myget 引數之一
dir=/dev/null # 下載 檔案存放的 目; m錄yget 引數之 一
proc=10 # 同時下載的程序數,如dlist.conf 有100 個檔案地,編號為1-100; 如果
配置為10, 則保證有10個myget 下載編號為1-10 的?檔案,如果下載完了,則去下載11,12,
以此類推; 要保證同時有10個myget 同時在執行.
(2)dlist.conf: 指定下載列表, 每行是檔案的url
http://ip1/?le1
http://ip1/?le2
http://ip2/?le1
(3) dlimit.conf: 單位的規則由程式設計者自己制定
00:00 200k
00:05 0m
00:10 $1
00:15 $1
⋯⋯
23:50 100k
23:55 95m
解釋一下此配置?檔案:
(1)一天有24*60/5 個”五分鐘”, 這個檔案裡有24*60/5 行, “ 00:00 200k
“是指00:00 到00:05 內, 所有myget 相關程序總下載速度應該被限制在200k/s 之下;
(2) 第二列的速率可以為0;
(3)注意這?裡面還有”$1”, 使用者可以在d.conf 裡指定任意個min_n,max_n 對,
對應於一個隨機數$n的上限和下限, 例如“00:10 $1 “,
檢視d.conf 中max_1=1g, mini_1=100m, 那麼在00:10 到00:15 內限速到100m 到1g之間
的一個隨機值, 可能是200m, 700m 等;
(4)多個同樣的$n, 需要獨立計算隨機數, 例如
00:10 $1
00:15 $1
00:10-00:15 和00:15-00:20 需要獨?立計算;
注意:
1.myget 是個 shell命令 , 所以可能需要在您採 用的語 言裡執shell行命令 ; 但如果 
C或C++ 實現,不排除直接包含myget 的原始碼;
2.假如myget 難以安裝在您的作業系統裡,可以直接編寫, 雖無法測試程式, 但更能
體現對語言的掌握程度.(myget-0.1.2-4.el6.x86_64.rpm 可以在RHEL 6.2 x86_64
上安裝成功)
10、有下面幾條路由,把他們彙總合併下:
58.16.0.0/12 via 58.63.246.89 dev em1
58.32.0.0/12 via 116.213.249.19 dev em1
58.48.0.0/12 via 116.213.249.19 dev em1
58.64.0.0/12 via 116.213.249.19 dev em1
58.80.0.0/12 via 58.63.246.89 dev em1
58.96.0.0/12 via 58.63.246.89 dev em1
58.112.0.0/12 via 58.63.246.89 dev em1
11、在 一臺做nat的linux 閘道器伺服器上,怎樣從系統中檢視 一個ip為源2.3.4.5 且目的端 口
為34512 的連結, 經過nat 轉換後的具體ip地址。
12、在windows 的cmd 下ping 83421345 顯示的點分十進位制ip是多少並用自己熟悉的語
言,寫出ip轉換演算法功能函式程式碼。

#!/bin/bash

function int_to_ip()
{
        a=$(($1/256/256/256))
        b=$(($1/256/256 -$a*256))
        c=$(($1/256 -$a*256*256-$b*256))
        d=$(($1-$a*256*256*256-$b*256*256-$c*256))
        echo $a"."$b"."$c"."$d
}

ip=83421345
count=10
i=1
while [ $i -lt $count ]
do
        nip=`int_to_ip $ip`
        echo $nip
        i=$(($i+1))
        ip=$(($ip+1))
done




#!/bin/sh
 
if [ $# -ne 2 ]
then
    echo "$0 -[i|n] [ip|num]"
    exit 1
fi
 
function num2ip()
{
    num=$1
    a=$((num>>24))
    b=$((num>>16&0xff))
    c=$((num>>8&0xff))
    d=$((num&0xff))
 
    echo "$d.$c.$b.$a"
}
 
function ip2num()
{
    ip=$1
    a=`echo $ip | awk -F'.' '{print $1}'`
    b=`echo $ip | awk -F'.' '{print $2}'`
    c=`echo $ip | awk -F'.' '{print $3}'`
    d=`echo $ip | awk -F'.' '{print $4}'`
 
    echo "$(((d<<24)+(c<<16)+(b<<8)+a))"
}
 
if [ "$1" = "-i" ]
then
    ip2num $2
elif [ "$1" = "-n" ]
then
    num2ip $2
else
    echo "$0 -[i|n] [ip|num]"
    exit 1
fi

13、在linux 系統和其他廠家網路裝置,靜態路由,直連路由優先順序順序是什麼

1)開頭加直譯器:#!/bin/bash

2)語法縮排,使用四個空格;多加註釋說明。

3)命名建議規則:變數名大寫、區域性變數小寫,函式名小寫,名字體現出實際作用。

4)預設變數是全域性的,在函式中變數local指定為區域性變數,避免汙染其他作用域。

5)有兩個命令能幫助我除錯指令碼:set -e 遇到執行非0時退出指令碼,set-x 列印執行過程。

6)寫指令碼一定先測試再到生產上。

1 獲取隨機字串或數字

獲取隨機8位字串:

方法1:
# echo $RANDOM |md5sum |cut -c 1-8
471b94f2
方法2:
# openssl rand -base64 4
vg3BEg==
方法3:
# cat /proc/sys/kernel/random/uuid |cut -c 1-8
ed9e032c

獲取隨機8位數字:

方法1:
# echo $RANDOM |cksum |cut -c 1-8
23648321
方法2:
# openssl rand -base64 4 |cksum |cut -c 1-8
38571131
方法3:
# date +%N |cut -c 1-8
69024815

cksum:列印CRC效驗和統計位元組

2 定義一個顏色輸出字串函式

方法1:
function echo_color() {
    if [ $1 == "green" ]; then
        echo -e "\033[32;40m$2\033[0m"
    elif [ $1 == "red" ]; then
        echo -e "\033[31;40m$2\033[0m"
    fi
}
方法2:
function echo_color() {
    case $1 in
        green)
            echo -e "\033[32;40m$2\033[0m"
            ;;
        red)
            echo -e "\033[31;40m$2\033[0m" 
            ;;
        *) 
            echo "Example: echo_color red string"
    esac
}
使用方法:echo_color green "test"

function關鍵字定義一個函式,可加或不加。

3 批量建立使用者

#!/bin/bash
DATE=$(date +%F_%T)
USER_FILE=user.txt
echo_color(){
    if [ $1 == "green" ]; then
        echo -e "\033[32;40m$2\033[0m"
    elif [ $1 == "red" ]; then
        echo -e "\033[31;40m$2\033[0m"
    fi
}
# 如果使用者檔案存在並且大小大於0就備份
if [ -s $USER_FILE ]; then
    mv $USER_FILE ${USER_FILE}-${DATE}.bak
    echo_color green "$USER_FILE exist, rename ${USER_FILE}-${DATE}.bak"
fi
echo -e "User\tPassword" >> $USER_FILE
echo "----------------" >> $USER_FILE
for USER in user{1..10}; do
    if ! id $USER &>/dev/null; then
        PASS=$(echo $RANDOM |md5sum |cut -c 1-8)
        useradd $USER
        echo $PASS |passwd --stdin $USER &>/dev/null
        echo -e "$USER\t$PASS" >> $USER_FILE
        echo "$USER User create successful."
    else
        echo_color red "$USER User already exists!"
    fi
done

4 檢查軟體包是否安裝

#!/bin/bash
if rpm -q sysstat &>/dev/null; then
    echo "sysstat is already installed."
else
    echo "sysstat is not installed!"
fi

5 檢查服務狀態

#!/bin/bash
PORT_C=$(ss -anu |grep -c 123)
PS_C=$(ps -ef |grep ntpd |grep -vc grep)
if [ $PORT_C -eq 0 -o $PS_C -eq 0 ]; then
    echo "內容" | mail -s "主題" [email protected]
fi

6 檢查主機存活狀態

方法1:將錯誤IP放到數組裡面判斷是否ping失敗三次

#!/bin/bash  
IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"
for IP in $IP_LIST; do
    NUM=1
    while [ $NUM -le 3 ]; do
        if ping -c 1 $IP > /dev/null; then
            echo "$IP Ping is successful."
            break
        else
            # echo "$IP Ping is failure $NUM"
            FAIL_COUNT[$NUM]=$IP
            let NUM++
        fi
    done
    if [ ${#FAIL_COUNT[*]} -eq 3 ];then
        echo "${FAIL_COUNT[1]} Ping is failure!"
        unset FAIL_COUNT[*]
    fi
done

方法2:將錯誤次數放到FAIL_COUNT變數裡面判斷是否ping失敗三次

#!/bin/bash  
IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"
for IP in $IP_LIST; do
    FAIL_COUNT=0
    for ((i=1;i<=3;i++)); do
        if ping -c 1 $IP >/dev/null; then
            echo "$IP Ping is successful."
            break
        else
            # echo "$IP Ping is failure $i"
            let FAIL_COUNT++
        fi
    done
    if [ $FAIL_COUNT -eq 3 ]; then
        echo "$IP Ping is failure!"
    fi
done

方法3:利用for迴圈將ping通就跳出迴圈繼續,如果不跳出就會走到列印ping失敗

#!/bin/bash
ping_success_status() {
    if ping -c 1 $IP >/dev/null; then
        echo "$IP Ping is successful."
        continue
    fi
}
IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"
for IP in $IP_LIST; do
    ping_success_status
    ping_success_status
    ping_success_status
    echo "$IP Ping is failure!"
done

7 監控CPU、記憶體和硬碟利用率

1)CPU

藉助vmstat工具來分析CPU統計資訊。

#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig eth0 |awk -F '[ :]+' '/inet addr/{print $4}')  # 只支援CentOS6
MAIL="[email protected]"
if ! which vmstat &>/dev/null; then
    echo "vmstat command no found, Please install procps package." 
    exit 1
fi
US=$(vmstat |awk 'NR==3{print $13}')
SY=$(vmstat |awk 'NR==3{print $14}')
IDLE=$(vmstat |awk 'NR==3{print $15}')
WAIT=$(vmstat |awk 'NR==3{print $16}')
USE=$(($US+$SY))
if [ $USE -ge 50 ]; then
    echo "
    Date: $DATE
    Host: $IP
    Problem: CPU utilization $USE
    " | mail -s "CPU Monitor" $MAIL
fi

2)記憶體

#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig eth0 |awk -F '[ :]+' '/inet addr/{print $4}')  
MAIL="[email protected]"
TOTAL=$(free -m |awk '/Mem/{print $2}')
USE=$(free -m |awk '/Mem/{print $3-$6-$7}')
FREE=$(($TOTAL-$USE))
# 記憶體小於1G傳送報警郵件
if [ $FREE -lt 1024 ]; then
    echo "
    Date: $DATE
    Host: $IP
    Problem: Total=$TOTAL,Use=$USE,Free=$FREE
    " | mail -s "Memory Monitor" $MAIL
fi

3)硬碟

#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig eth0 |awk -F '[ :]+' '/inet addr/{print $4}')  
MAIL="[email protected]"
TOTAL=$(fdisk -l |awk -F'[: ]+' 'BEGIN{OFS="="}/^Disk \/dev/{printf "%s=%sG,",$2,$3}')
PART_USE=$(df -h |awk 'BEGIN{OFS="="}/^\/dev/{print $1,int($5),$6}')
for i in $PART_USE; do
    PART=$(echo $i |cut -d"=" -f1)
    USE=$(echo $i |cut -d"=" -f2)
    MOUNT=$(echo $i |cut -d"=" -f3)
    if [ $USE -gt 80 ]; then
        echo "
        Date: $DATE
        Host: $IP
        Total: $TOTAL
        Problem: $PART=$USE($MOUNT)
        " | mail -s "Disk Monitor" $MAIL
    fi
done

8 批量主機磁碟利用率監控

前提監控端和被監控端SSH免互動登入或者金鑰登入。

寫一個配置檔案儲存被監控主機SSH連線資訊,檔案內容格式:IP User Port

#!/bin/bash
HOST_INFO=host.info
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
    USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)
    PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)
    TMP_FILE=/tmp/disk.tmp
    ssh -p $PORT [email protected]$IP 'df -h' > $TMP_FILE
    USE_RATE_LIST=$(awk 'BEGIN{OFS="="}/^\/dev/{print $1,int($5)}' $TMP_FILE)
    for USE_RATE in $USE_RATE_LIST; do
        PART_NAME=${USE_RATE%=*}
        USE_RATE=${USE_RATE#*=}
        if [ $USE_RATE -ge 80 ]; then
            echo "Warning: $PART_NAME Partition usage $USE_RATE%!"
        fi
    done
done

9 檢查網站可用性

1)檢查URL可用性

方法1:
check_url() {
    HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $1)
    if [ $HTTP_CODE -ne 200 ]; then
        echo "Warning: $1 Access failure!"
    fi
}
方法2:
check_url() {
if ! wget -T 10 --tries=1 --spider $1 >/dev/null 2>&1; then  
#-T超時時間,--tries嘗試1次,--spider爬蟲模式
        echo "Warning: $1 Access failure!"
    fi
}

使用方法:check_url www.baidu.com

2)判斷三次URL可用性

思路與上面檢查主機存活狀態一樣。

方法1:利用迴圈技巧,如果成功就跳出當前迴圈,否則執行到最後一行
#!/bin/bash  
check_url() {
    HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $1)
    if [ $HTTP_CODE -eq 200 ]; then
        continue
    fi
}
URL_LIST="www.baidu.com www.agasgf.com"
for URL in $URL_LIST; do
    check_url $URL
    check_url $URL
    check_url $URL
    echo "Warning: $URL Access failure!"
done
方法2:錯誤次數儲存到變數
#!/bin/bash  
URL_LIST="www.baidu.com www.agasgf.com"
for URL in $URL_LIST; do
    FAIL_COUNT=0
    for ((i=1;i<=3;i++)); do
        HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)
        if [ $HTTP_CODE -ne 200 ]; then
            let FAIL_COUNT++
        else
            break
        fi
    done
    if [ $FAIL_COUNT -eq 3 ]; then
        echo "Warning: $URL Access failure!"
    fi
done
方法3:錯誤次數儲存到陣列
#!/bin/bash  
URL_LIST="www.baidu.com www.agasgf.com"
for URL in $URL_LIST; do
    NUM=1
    while [ $NUM -le 3 ]; do
        HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)
        if [ $HTTP_CODE -ne 200 ]; then
            FAIL_COUNT[$NUM]=$IP  #建立陣列,以$NUM下標,$IP元素
            let NUM++
        else
            break
        fi
    done
    if [ ${#FAIL_COUNT[*]} -eq 3 ]; then
        echo "Warning: $URL Access failure!"
        unset FAIL_COUNT[*]    #清空陣列
    fi
done

10 檢查MySQL主從同步狀態

#!/bin/bash  
USER=bak
PASSWD=123456
IO_SQL_STATUS=$(mysql -u$USER -p$PASSWD -e 'show slave status\G' |awk -F: '/Slave_.*_Running/{gsub(": ",":");print $0}')  #gsub去除冒號後面的空格
for i in $IO_SQL_STATUS; do
    THREAD_STATUS_NAME=${i%:*}
    THREAD_STATUS=${i#*:}
    if [ "$THREAD_STATUS" != "Yes" ]; then
        echo "Error: MySQL Master-Slave $THREAD_STATUS_NAME status is $THREAD_STATUS!"
    fi
done