案例8、傻瓜運維工具

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

要求以下:mysql

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

2)而後會列出一個命令列表,用戶只須要打對應數字,就能夠運行列表中的命令sql

3)列表中的功能有shell

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

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

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

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
相關文章
相關標籤/搜索