shell訓練營Day13 阿新 • • 發佈:2019-01-03 練習六:寫一個指令碼,判斷本機的80埠(假如服務為httpd)是否開啟著,如果開啟著什麼都不做,如果發現埠不存在,那麼重啟一下httpd服務,併發郵件通知你自己。指令碼寫好後,可以每一分鐘執行一次,也可以寫一個死迴圈的指令碼,30s檢測一次。 核心要點 檢測80埠使用nmap -p 80 127.0.0.1或者netstat -lntp|grep -w 80 #!/bin/bashbr/>[email protected]while :don=netstat -lntp |grep ':80 '|wc -lif [ $n -eq 0 ]then/usr/local/apache2/bin/apachectl -k restart 2>/tmp/apache.errpython mail.py $m "80埠關閉" "已經重啟httpd服務"pn=pgrep -l httpd|wc -l if [ $pn -eq 0 ]thenpython mail.py $m "httpd重啟失敗" "head -1 /tmp/apache.err"fifi 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 +%Fd2=date +%d #定義日誌exec &> /tmp/mysql_bak.log echo "mysql backup begin at date" #對所有資料庫進行遍歷for db in db1 db2 db3 db4 db5do$mysqldump -u$bakuser -p$passwd $db >$bakdir/$db-$d1.sqldone #對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 db5dorsync -a $bakdir/$db-$d1.sql $remote_dir/$db-$d2.sqldone 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/bashlog=/data/log/access.logwhile :do502_n=tail -n 300 $log |grep -c ' 502 'if [ -z "$502_n" ]thenexitfi if [ $502_n -gt 80 ]then/etc/init.d/php-fpm restart >/dev/null 2>/tmp/php-fpm.errfpm_p_n=pgrep -l php-fpm|wc -lif [ $fpm_p_n -eq 0 ]thenpython mail.py [email protected] "php-fpm重啟失敗" "head -1 /tmp/php-fpm.err"exitfifisleep 10done 練習九把一個文字文件的前5行中包含字母的行刪除掉,同時把6到10行中的全部字母刪除掉。 核心要點 sed命令 參考答案 #!/bin/bashsed '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/bashc="Bash also interprets a number of multi-character options."n=echo $c|awk -F '[ +-.]' '{print NF}'for ((i=1;i<$n;i++))dol=echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'|wc -mif [ $l -lt 6 ]thenecho $c|awk -F '[ +-.]' -v j=$i '{print $j}'fidone