案例八、傻瓜運維工具

運維的工作,很多事情都是周而復始,而且所做的事情就那麼幾件,除非有特殊需求需要特別對待。所以寫了一個傻瓜運維腳本。

要求如下:

1)當執行腳本時,首先會打印系統的幾個狀態值:系統時間、負載、CPU使用情況、內存使用情況、磁盤使用情況、網卡流量(5s內均值,需列出所有網卡)

2)然後會列出一個命令列表,用戶只需要打對應數字,就可以運行列表中的命令

3)列表中的功能有

a)查看網站訪問日誌最後100行(假設該服務器上只有一個網站,訪問日誌路徑/data/logs/www.log

b)查看mysql的慢查詢日誌,最後50行(mysql慢查詢日誌路徑/data/mysql/slow.log

c)查看php-fpm的慢執行日誌,最後50行(日誌路徑/usr/local/php/logs/slow.log)

d)重啓php-fpm服務

e)重啓Nginx服務

f)查看MySQL隊列

g)退出腳本

4)腳本爲常駐腳本,按Ctrl c組合鍵或者q/Q退出腳本


知識點一:case邏輯判斷

前面幾個案例頻繁用到if邏輯判斷,當判斷的條件非常多,則建議用case,case使用場景示例:

case $name in
     zhangsan)
          echo "Hello,zhangsan."
          ;;
     lisi)
          echo "Hello,lisi."
          ;;
     wangwu)
          echo "Hello,wangwu."
         ;;
      *)
          echo "Sorry,there is no such person."
          ;;
esac

說明:case開頭,esac結尾,$name可選的值有zhangsan、lisi、wangwu,*指的是除了可選值外的其他情況。


知識點二:select用法

本案例中的菜單腳本用select實現起來非常方便,先看一個簡單的例子:

select name in zhangsan lisi wangwu
do
  case $name in
     zhangsan)
          echo "Hello,zhangsan."
          ;;
     lisi)
          echo "Hello,lisi."
          ;;
     wangwu)
          echo "Hello,wangwu."
         ;;
      *)
          echo "Sorry,there is no such person."
          ;;
  esac
done

在select腳本中,要結合case一起使用,執行select腳本後可以自動按照循環條件打印列表,而且只要不特意結束腳本,則腳本無限循環。執行腳本,結果如下:

# sh select.sh
1) zhangsan
2) lisi
3) wangwu
#? 1
Hello,zhangsan.
#? 2
Hello,lisi.
#? 3
Hello,wangwu.
#? 4
Sorry,there is no such person.
#? 
1) zhangsan
2) lisi
3) wangwu
#?

說明:這裏#?可以更改,需要定義PS3,更改以上腳本內容,如下:

PS3="Please select a number:"
select name in zhangsan lisi wangwu
do
  case $name in
     zhangsan)
          echo "Hello,zhangsan."
          ;;
     lisi)
          echo "Hello,lisi."
          ;;
     wangwu)
          echo "Hello,wangwu."
         ;;
      *)
          echo "Sorry,there is no such person."
          ;;
  esac
done

執行腳本後,結果如下:

# sh select.sh 
1) zhangsan
2) lisi
3) wangwu
Please select a number:1
Hello,zhangsan.
Please select a number:2
Hello,lisi.


知識點三:w命令

w命令:查看當前系統的負載

# w
 18:59:07 up 21 min,  2 users,  load average: 0.00, 0.04, 0.11
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      18:38   20:27   0.39s  0.39s -bash
root     pts/0    192.168.93.1     18:39    3.00s  0.10s  0.01s w

Linux管理員最常用的就是這個w命令了,該命令顯示的信息。

第一行從左邊開始顯示的信息依次是:時間,系統運行時間,登錄用戶數,平均負載。

第二行開始及下面所有的行,告訴我們的信息是,當前登錄的有哪些用戶,以及他們是從哪裏登錄的等等。

在這些信息中,最應該關注的是第一行的load average後面的三個值。

第一個值表示1分鐘內系統的平均負載值;

第二個值表示5分鐘內系統的平均負載值;

第三個值表示15分鐘內系統的平均負載值。

這個值的意義是,單位時間段內CPU活動進程數,這個值越大說明服務器壓力越大。一般情況下這個值只要不超過服務器的CPU數量就沒關係。

如何查看服務器有幾個CPU?

# cat /proc/cpuinfo 
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 158
model name	: Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz
stepping	: 9
microcode	: 0x8e
cpu MHz		: 2501.000
cache size	: 6144 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 2
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 22
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat
bogomips	: 5002.00
clflush size	: 64
cache_alignment	: 64
address sizes	: 43 bits physical, 48 bits virtual
power management:

/proc/cpuinfo這個文件記錄了CPU的詳細信息。如果服務器有2顆4核CPU,在Linux看來,它就是8個CPU。查看該文件會顯示8段類似的信息。所以,查看當前系統有幾個CPU,可以使用命令grep -c 'processor' /proc/cpuinfo。查看有幾顆物理CPU,查看關鍵字physical id。


知識點四:sar命令

sar命令很強大,它可以監控系統所有資源狀態,比如平均負載、網卡流量、硬盤狀態、內存使用等。

它不同於其它系統狀態監控的地方在於,它可以打印歷史信息,可以顯示當天從零點開始到到當前時間的系統狀態信息。

它的數據庫文件在/var/log/sa目錄下,默認保存一個月。因爲這個命令太複雜,所以只介紹幾個:

1)查看網卡流量sar -n DEV

# sar -n DEV 1 2
Linux 3.10.0-693.el7.x86_64 (wbs) 	2019年07月22日 	_x86_64_	(2 CPU)

19時33分29秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
19時33分30秒     ens37      0.00      0.00      0.00      0.00      0.00      0.00      0.00
19時33分30秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
19時33分30秒     ens33      0.00      0.00      0.00      0.00      0.00      0.00      0.00

19時33分30秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
19時33分31秒     ens37      0.00      0.00      0.00      0.00      0.00      0.00      0.00
19時33分31秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
19時33分31秒     ens33      1.00      1.00      0.06      0.49      0.00      0.00      0.00

平均時間:     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
平均時間:     ens37      0.00      0.00      0.00      0.00      0.00      0.00      0.00
平均時間:        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
平均時間:     ens33      0.50      0.50      0.03      0.25      0.00      0.00      0.00

說明:後面跟1 2,表示每隔1秒顯示一次,顯示2次。

另外也可以查看某一天的網卡流量歷史,使用-f選項,後面跟文件名。如果系統格式是Redhat或者CentOS,那麼sar的庫文件一定是在/var/log/sa目錄下的。

# sar -n DEV -f /var/log/sa/sa21

2)查看歷史負載

# sar -q
Linux 3.10.0-693.el7.x86_64 (wbs) 	2019年07月22日 	_x86_64_	(2 CPU)

18時38分04秒       LINUX RESTART

18時40分01秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
18時50分01秒         4       208      0.00      0.12      0.16         0
19時00分01秒         6       207      0.00      0.03      0.11         0
19時10分01秒         3       208      0.07      0.07      0.07         0
19時20分02秒         5       207      0.00      0.03      0.05         0
19時30分01秒         1       207      0.00      0.01      0.05         0
平均時間:         4       207      0.01      0.05      0.09         0

這個命令有助於我們查看服務器在過去的某個時間的負載情況。

runq-sz:run狀態的進程數量;

plist-sz:進程數量;

ldavg-1:一分鐘內平均負載值;

ldavg-5:五分鐘內平均負載值;

ldavg-15:十五分鐘內平均負載值;

blocked:被阻塞的進程數。


3)不帶選項,查看CPU使用情況

# sar
Linux 3.10.0-693.el7.x86_64 (wbs) 	2019年07月22日 	_x86_64_	(2 CPU)

18時38分04秒       LINUX RESTART

18時40分01秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
18時50分01秒     all      0.10      0.00      0.48      0.01      0.00     99.41
19時00分01秒     all      0.08      0.00      0.24      0.01      0.00     99.68
19時10分01秒     all      0.09      0.01      0.31      0.06      0.00     99.53
19時20分02秒     all      0.10      0.00      0.25      0.00      0.00     99.65
19時30分01秒     all      0.14      0.00      0.32      0.03      0.00     99.51
19時40分01秒     all      0.13      0.00      0.30      0.01      0.00     99.56
平均時間:     all      0.11      0.00      0.32      0.02      0.00     99.56


知識點五:MySQL慢查詢日誌

MySQL的慢查詢日誌用來記錄在MySQL中響應時間超過閾值的語句,具體指運行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。默認情況下,mysql數據庫是不開啓慢查詢日誌的,long_query_time的默認值爲10(即10秒,建議設置爲1秒),即運行10秒以上的語句是慢查詢語句。


通過分析慢查詢日誌讓我們找到那麼查詢很慢的SQL語句,然後就可以針對這些慢查詢SQL進行優化,通常情況下,造成慢查詢的原因往往是因爲表沒有創建索引。

如下爲MySQL5.7版本my.cnf配置慢查詢日誌的參數:

slow_query_log = on
long_query_time = 1
slow_query_log_file = /data/mysql/slow.log


知識點六:php-fpm慢執行日誌

對於LNMP架構的網站,如果訪問卡頓,我們第一時間應該想到查看php-fpm的慢執行日誌,該日誌和mysql的慢查詢日誌類似,它會記錄執行慢的PHP代碼,可以說php-fpm的慢執行日誌是追蹤網站性能的利器。在php-fpm.conf中加上兩行配置即可:

request_slowlog_timeout = 1
slowlog = /usr/local/php/logs/slow.log


知識點七:shell腳本中顯示顏色

爲了讓shell腳本在執行過程中輸出的信息更加容易分辨,我們會特意給它帶上顏色。先看一個例子:

# echo -e "\033[31m 紅色字 \033[0m"
 紅色字

這樣輸出的字顏色爲紅色,常用的幾種顏色總結如下:
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 紅色字 \033[0m"
echo -e "\033[32m 綠色字 \033[0m"
echo -e "\033[33m ×××字 \033[0m"
echo -e "\033[34m 藍色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天藍字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"


本案例參考腳本

#!/bin/bash
#這是一個傻瓜運維腳本,根據列表輸入對應數字即可實現想要的功能
#作者:
#日期:
#版本:v0.1

LANG=en
sar 1 5 > /tmp/cpu.log &
sar -n DEV 1 5 |grep '^Average:' > /tmp/net.log &
echo -n "收集數據"
for i in `seq 1 5`
do
  echo -n "."
  sleep 1
done
echo

t=`date +"%F %T"`
load=`uptime |awk -F 'load averages?:' '{print $2}'|cut -d '.' -f1`
cpu_idle=`tail -1 /tmp/cpu.log|awk '{print $NF}'`
cpu_use=`echo "scale=2;100-$cpu_idle"|bc`
mem_tot=`free -m |grep '^Mem:'|awk '{print $2}'`
men_ava=`free -m |grep '^Mem:'|awk '{print $NF}'`
mysql_p="dR6wB1jzp"
echo -e "\033[32m當前時間:$t \033[0m"
echo "######"
echo -e "\033[31m當前負載:$load \033[0m"
echo "######"
echo -e "\033[33mCPU使用率:$cpu_use% \033[0m"
echo "######"
echo -e "\033[34m內存總數:$men_tot"MB",內存剩餘:$men_ava"MB" \033[0m"
echo "######"
echo -e "\033[35m磁盤空間使用情況: \033[0m"
df -h
echo "######"
echo -e "\033[36m磁盤iNode使用情況: \033[0m"
df -i
echo "######"
sed '1d' /tmp/net.log |awk '{print "網卡"$2":入口流量"$5/1000*8"Mbi,出口流量"$6/1000*8"Mbi"}'
echo "######"

get_acc_log()
{
    tail -100 /data/logs/www.log
}

get_mysql_slow_log()
{
    tail -50 /data/mysql/slow.log
}

get_php_slow_log()
{
    tail -50 /usr/local/php/logs/slow.log
}

restart_php()
{
    /etc/init.d/php-fpm restart
}

restart_nginx()
{
    /etc/init.d/nginx restart
}

get_mysql_process()
{
    mysql -uroot -p$mysql_p -e "show processlist"
}


PS3="請選擇你想要做的操作:"

select c in 查看訪問日誌 查看mysql慢查詢日誌 查看php-fpm的慢執行日誌 重啓php-fpm服務 重啓nginx服務 查看mysql隊列 退出腳本
do
    case $c in
查看訪問日誌)
    get_acc_log
    ;;
查看mysql慢查詢日誌)
    get_mysql_slow_log
    ;;
查看php-fpm的慢執行日誌)
    get_php_slow_log
    ;;
重啓php-fpm服務)
    restart_php
    ;;
重啓nginx服務)
    restart_nginx
    ;;
查看mysql隊列)
    get_mysql_process
    ;;
退出腳本)
    exit 0
    ;;
    esac
done


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章