1. 程式人生 > >shell實戰訓練營Day13

shell實戰訓練營Day13

#!/bin/bash
n=netstat -lntp|grep ':80 '|wc -l
#stat=nmap -p 80 127.0.0.1|grep 'tcp/80'|awk '{print $2}'br/>[email protected]
while :
do
if [ $n -eq 0 ]

if [ $stat == "closed" ]

  then
/usr/local/apache2.4/bin/apachectl -k restart  2> /tmp/apache2.4.err
python mail.py $m "zhuti" "chongqi httpd fuwu"
    pn=`pgrep -l httpd|wc -l`
    if [ $pn -eq 0 ]
       then 
    python mail,py  $m  "httpd service chongqi shibai"  "head -l /tmp/apache2.4.err" 
fi
sleep 30

done

寫一個指令碼,判斷本機的80埠(假如服務為httpd)是否開啟著,如果開啟著什麼都不做,如果發現埠不存在,那麼重啟一下httpd服務, 併發郵件通知你自己。指令碼寫好後,可以每一分鐘執行一次,也可以寫一個死迴圈的指令碼,30s檢測一次。

核心要點
檢測80埠使用nmap -p 80 127.0.0.1或者netstat -lntp|grep -w 80
重啟httpd服務的命令要知道
發郵件指令碼依然使用mail.py

設計一個shell指令碼來備份資料庫,首先在本地伺服器上儲存一份資料,然後再遠端拷貝一份,本地儲存一週的資料,遠端儲存一個月。

假定,我們知道mysql root賬號的密碼,要備份的庫為discuz,本地備份目錄為/bak/mysql, 遠端伺服器ip為192.168.123.30, 遠端提供了一個rsync服務,備份的地址是 192.168.123.30::backup . 寫完指令碼後,需要加入到cron中,每天凌晨3點執行。

核心要點
備份資料庫的命令
同步到遠端去的命令
本地一週,可以用date +%w做為字尾,遠端一個月可以用date +%d做為字尾

#!/bin/bash
d1=date +%w
d2=date +%d
local_bakdir=/bak/mysql
remote_bakdir=192.168.123.30::backup
exec 1> /tmp/mysqlbal.log 2>/tmp/mysqlbak.err
echo "mysql backup begin at date"
mysqldump -uroot -pxxxx discuz >$local_bakdir/discuz.sql.$d1
rsync -az $local_bakdir/discuz.sql.$di $remote_bakdir/discuz.sql.$d2
echo "mysql backup end at date

"

伺服器上跑的是LNMP環境,近期總是有502現象。502為網站訪問的狀態碼,200正常,502錯誤是nginx最為普遍的錯誤狀態碼。

由於502只是暫時的,並且只要一重啟php-fpm服務則502消失,但不重啟的話,則會一直持續很長時間。

所以有必要寫一個監控指令碼,監控訪問日誌的狀態碼,一旦發生502,則自動重啟一下php-fpm。

我們設定:

1)access_log /data/log/access.log

2)指令碼死迴圈,每10s檢測一次(假設每10s鐘的日誌條數為300左右)

3)重啟php-fpm的方法是 /etc/init.d/php-fpm restart

要點
用curl檢測狀態碼是否是502或者通過分析訪問日誌判斷狀態碼的比率
重啟php-fpm服務的命令

#!/bin/bash
log=/data/log/access.log
502n=tail -n 300 $log|grep -c ' 502 '
while :
do
if [ -z $502_n ]
then
exit
fi
if [ $502_n -ge 5 ]
then
/etc/init.d/php-fpm restart > /dev/null 2> /tmp/php.fpm.err
fpm_p_n=pgrep -l php-fpm|wc -l
if [ $fpm_p_n -eq 0 ]
then
python mail.py [email protected] "zhuti" "neirong"
exit
fi
fi
sleep 10
done

題目要求
把一個文字文件的前5行中包含字母的行刪除掉,同時把6到10行中的全部字母刪除掉。

核心要點
sed命令

#!/bin/bash
sed '1,5'p qq.txt|sed '/[a-zA-Z]/d'
sed '1,5d' qq.txt|sed '1,5s/[a-zA-Z]//g'

題目要求
用shell列印下面這句話中字母數小於6的單詞。 Bash also interprets a number of multi-character options.

核心要點
for迴圈遍歷所有單詞
wc -L獲取字串長度
#!/bin/bash
c="bash also interprets anumber of mutil-character options."
n=echo $c|awk -F '[ +-.]' '{print NF}'
for ((i=1;i<$i;i++))
do
l=echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'|wc -L
if [ $l -lt 6 ]
then
echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'
fi
done