不看后悔的Linux生產(chǎn)服務(wù)器Shell腳本分享
原創(chuàng)【51CTO獨家特稿】作為一名Linux/unix系統(tǒng)管理員,我經(jīng)常遇到人問這個問題:shell能做什么?PHP這么強大,為什么不用PHP來完成工作呢?其實相對于PHP這些開發(fā)語言而言,shell主要用于數(shù)據(jù)庫備份(SVN備份)、計劃任務(wù)(crontab)、服務(wù)狀態(tài)監(jiān)控、FTP遠(yuǎn)程備份等。對于這些任務(wù),shell的強大是大家都公認(rèn)的,這也是每一個Linux/unix系統(tǒng)管理員的基本之一。現(xiàn)在在Windows 2008里也出現(xiàn)了PowerShell的身影,十分不錯。
下面我會用我的線上服務(wù)器的shell腳本舉例來讓大家了解shell及其用途。
【目錄】
- MySQL的熱備份腳本
- 用FTP同步服務(wù)器
- Keepalived的監(jiān)控切換腳本
- SVN的版本庫的批量備份
- 自動監(jiān)控ADSL并重拔號
- Linux批量生成生成帳戶(10月11日更新)
- 測試局域網(wǎng)內(nèi)主機是否alive(10月11日更新)
點擊下方的子頁面標(biāo)題,進(jìn)入對應(yīng)的shell腳本頁面進(jìn)行閱讀。
#p#
一、MySQL的熱備份腳本
這是MySQL的備份方式之一,腳本如下:
#!/bin/bash PATH=/usr/local/sbin:/usr/bin:/bin # The Directory of Backup BACKDIR=/usr/mysql_backup # The Password of MySQL ROOTPASS=password # Remake the Directory of Backup rm -rf $BACKDIR mkdir -p $BACKDIR # Get the Name of Database DBLIST=`ls -p /var/lib/mysql | grep / | tr -d /` # 偷瞄了下我同事寫腳本的方式,發(fā)現(xiàn)他直接將DBLIST一個個手動敲上去了 # 數(shù)據(jù)庫少的情況是可以的,如果數(shù)據(jù)庫是成百以上呢,呵呵 # Backup with Database for dbname in $DBLIST do mysqlhotcopy $dbname -u root -p $ROOTPASS $BACKDIR | logger -t mysqlhotcopy done
許多系統(tǒng)管理員喜歡用mysqldump --opt來備份數(shù)據(jù)庫,由于比較簡單,我這里就不重復(fù)了。
#p#
二、用FTP同步服務(wù)器
許多系統(tǒng)管理員喜歡用rsync同步二臺服務(wù)器之間的數(shù)據(jù),但我們更喜歡用FTP來實現(xiàn),其好處是:
- FTP比rsync更能耗盡帶寬,所以它更適合同步數(shù)據(jù)庫(尤其是幾百G的數(shù)據(jù))
- 配置起來相當(dāng)方便,尤其是用pureftpd
- rsync的優(yōu)勢是可以快速海量同步小文件,比如二級目錄或三級目錄下的批量圖片等
基本上FTP和rsync同步各有優(yōu)勢,看系統(tǒng)管理員的取舍了。以下是本部分要介紹的FTP同步的shell腳本方式:
FTPOLDDATE=`date +%Y-%m-%d -d '-60 days'` #在FTP定義60天間的日期變量,是為了在FTP端保存60天的數(shù)據(jù),逾期刪除。 HOST=192.168.4.199 FTP_USERNAME=db FTP_PASSWORD=password cd ${BACKDIR}/${DATE} ftp -i -n -v << ! open ${HOST} user ${FTP_USERNAME} ${FTP_PASSWORD} bin cd ${FTPOLDDATE} mdelete * cd .. rmdir ${FTPOLDDATE} mkdir ${DATE} cd ${DATE} mput * bye !
#p#
三、Keepalived的監(jiān)控切換腳本
實現(xiàn)功能如下:針對Nginx+Keepalived,編寫nginx監(jiān)控腳本nginx_pid.sh,放置在后臺一直監(jiān)控nginx進(jìn)程;如進(jìn)程消失,嘗試重啟nginx,如是失敗則立即停掉本機的keepalived服務(wù),讓另一臺負(fù)載均衡器接手。此腳本詳細(xì)內(nèi)容如下:
#!/bin/bash while : do nginxpid=`ps -C nginx --no-header | wc -l` if [ $nginxpid -eq 0 ];then ulimit -SHn 65535 #在并發(fā)數(shù)很大的情況下,連接數(shù)過小會導(dǎo)致linux狂報錯,所以直接在nginx啟動前定義 /usr/local/nginx/sbin/nginx sleep 5 nginxpid=`ps -C nginx --no-header | wc -l` if [ $nginxpid -eq 0 ];then /etc/init.d/keepalived stop fi fi sleep 5 done
相關(guān)說明可參考我發(fā)在組網(wǎng)頻道的《企業(yè)級WEB的負(fù)載均衡高可用之LVS+Keepalived》一文。
#p#
四、SVN的版本庫的批量備份
實現(xiàn)其功能蠻簡單,主要是用了svnadmin hotcopy,這東東功能很強大,我經(jīng)常用于svn的版本庫的轉(zhuǎn)移(順便說一句,上次不小心誤操作將庫刪光了,很輕松的用svnadmin hotcopy將其恢復(fù)過來了)。
for PROJECT in test project svntest do cd ${SVNDIR} ${SVNADMIN} hotcopy ${PROJECT} ${BACKDIR}/${DATE}/${PROJECT} --clean-logs cd ${BACKDIR}/${DATE} tar zcvf ${PROJECT}_svn_${DATE}.tar.gz ${PROJECT} > /dev/null rm -rf ${PROJECT}
echo "Repository: ${PROJECT} backup done into ${BACKDIR}/${DATE}/ Successful!"
>> ${LogFile}
/bin/sleep 2
done
#p#
五、自動監(jiān)控ADSL并重拔號的shell腳本
公司辦公室的adsl愛掉線,一掉的話網(wǎng)關(guān)的gateway就沒了。因此編寫了下列腳本:
#!/bin/bash while : do
if route | tail -l | grep "0.0.0.0"
then
&>/dev/null
else
adsl-stop
adsl-start
fi
sleep 10
done
執(zhí)行腳本方法: nuhup sh route.sh &
注意前面要用上nohup,這樣避免root用戶logout時此腳本也退出生效的問題。
#p#
六、Linux批量生成生成帳戶腳本
此腳本應(yīng)用于生產(chǎn)環(huán)境下生成帳戶,也可生成成百上千個密碼相同的帳戶。腳本代碼如下:
#!/bin/bash for name in tom jerry joe jane do useradd $name echo redhat | passwd --stdin $name done
自己使用的時候,用自己需要的帳戶名列表替換掉這個代碼范例里的tom jerry joe jane等字段即可。密碼都是redhat,可以讓用戶之后自己更改。
#p#
七、測試局域網(wǎng)內(nèi)主機是否alive的小腳本
此腳本用于檢查192.168.1.100到192.168.1.200之間的主機是否alive。腳本如下:
#!/bin/bash #Checks to see if hosts 192.168.1.100-192.168.1.200 are alive for n in {100..200}; do host=192.168.1.$n ping -c2 $host &>/dev/null if [ $? = 0 ]; then
echo "$host is UP"
else
echo "$host is DOWN"
fi
done
※溫馨小提示:注意$?與=之間必須空格。
小結(jié)
其它一些自動監(jiān)控MySQL狀態(tài)等腳本我感覺比較簡單,適合于新手學(xué)習(xí),有興趣的可去撫琴煮酒的百度博客參觀學(xué)習(xí)。如果大家感興趣,以后也會分批整理出來跟大家分享。希望大家看了諸如此類的shell腳本,能從中學(xué)到對自己有所幫助的知識。
【編輯推薦】