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

shell訓練營Day13

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

核心要點

  • 檢測80埠使用nmap -p 80 127.0.0.1或者netstat -lntp|grep -w 80

#!/bin/bashbr/>[email protected]
while :
do
n=netstat -lntp |grep ':80 '|wc -l
if [ $n -eq 0 ]
then
/usr/local/apache2/bin/apachectl -k restart 2>/tmp/apache.err
python mail.py $m "80埠關閉" "已經重啟httpd服務"
pn=pgrep -l httpd|wc -l


if [ $pn -eq 0 ]
then
python mail.py $m "httpd重啟失敗" "head -1 /tmp/apache.err"
fi
fi

sleep 30

done

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

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

核心要點

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

mysqldump="/usr/local/mysql/bin/mysqldump"
bakuser="backup"
passwd="34KpmyzUq"
bakdir="/data/backup"
remote_dir="rsync://10.10.20.100/mysqlbak"
d1=date +%F
d2=date +%d

#定義日誌
exec &> /tmp/mysql_bak.log

echo "mysql backup begin at date"

#對所有資料庫進行遍歷
for db in db1 db2 db3 db4 db5
do
$mysqldump -u$bakuser -p$passwd $db >$bakdir/$db-$d1.sql
done

#對1天前的所有sql檔案壓縮
find $bakdir/ -type f -name "*.sql" -mtime +1 |xargs gzip

#查詢一週以前的老檔案,並刪除
find $bakdir/ -type f -mtime +7 |xargs rm

#把當天的備份檔案同步到遠端
for db in db1 db2 db3 db4 db5
do
rsync -a $bakdir/$db-$d1.sql $remote_dir/$db-$d2.sql
done

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
while :
do
502_n=tail -n 300 $log |grep -c ' 502 '
if [ -z "$502_n" ]
then
exit
fi

if [ $502_n -gt 80 ]
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] "php-fpm重啟失敗" "head -1 /tmp/php-fpm.err"
exit
fi
fi
sleep 10
done

練習九
把一個文字文件的前5行中包含字母的行刪除掉,同時把6到10行中的全部字母刪除掉。

核心要點

sed命令

參考答案

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

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

核心要點

  • for迴圈遍歷所有單詞
  • wc -m獲取字串長度

#!/bin/bash
c="Bash also interprets a number of multi-character options."
n=echo $c|awk -F '[ +-.]' '{print NF}'
for ((i=1;i<$n;i++))
do
l=echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'|wc -m
if [ $l -lt 6 ]
then
echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'
fi
done