轉(zhuǎn)自工作中實用的Shell腳本實例 - 簡書
1. 內(nèi)存監(jiān)控腳本
#!/bin/bash#memory usemem_war_file=/tmp/mem_war.txtmem_use=`free -m | grep Mem | awk '{print $3}'`mem_total=`free -m | grep Mem | awk '{print $2}'`mem_percent=$((mem_use*100/mem_total))# echo "$mem_percent"%if (($mem_percent > 80));then? echo "`date +%F-%H-%M` mem: ${mem_percent}%" >$mem_war_file? echo "`date +%F-%H-%M` mem: ${mem_percent}%" | mail -s "mem warning" root fi
2. 檢測網(wǎng)卡流量何恶,并按規(guī)定格式記錄在日志中
#!/bin/bash########################################################檢測網(wǎng)卡流量罐寨,并按規(guī)定格式記錄在日志中#規(guī)定一分鐘記錄一次#日志格式如下所示:#2021-07-08 18:55#eth0 input: 1234bps#eth0 output: 1235bps######################################################3while :do#設(shè)置語言為英文厨幻,保障輸出結(jié)果是英文,否則會出現(xiàn)bugLANG=enlogfile=/tmp/`date +%d`.log#將下面執(zhí)行的命令結(jié)果輸出重定向到logfile日志中exec >> $logfiledate +"%F %H:%M"#sar命令統(tǒng)計的流量單位為kb/s髓帽,日志格式為bps,因此要*1000*8sar -n DEV 1 59|grep Average|grep eth0|awk '{print $2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}'echo "####################"#因為執(zhí)行sar命令需要59秒胳蛮,因此不需要sleepdone
3. 監(jiān)測Nginx訪問日志502情況麸粮,并做相應(yīng)動作
假設(shè)服務(wù)器為lnmp環(huán)境,近期訪問經(jīng)常出現(xiàn)502現(xiàn)象,且502錯誤在重啟php-fpm服務(wù)后消失签餐,因此編寫監(jiān)控腳本寓涨,一旦出現(xiàn)502,則自動重啟php-fpm服務(wù)氯檐。
#場景:#1.訪問日志文件的路徑:/data/log/access.log#2.腳本死循環(huán)戒良,每10秒檢測一次,10秒的日志條數(shù)為300條冠摄,出現(xiàn)502的比例不低于10%(30條)則需要重啟php-fpm服務(wù)#3.重啟命令為:/etc/init.d/php-fpm restart#!/bin/bash############################################################監(jiān)測Nginx訪問日志502情況糯崎,并做相應(yīng)操作###########################################################log=/data/log/access.logN=30 #設(shè)定閾值while :do #查看訪問日志的最新300條,并統(tǒng)計502的次數(shù)? ? err=`tail -n 300 $log |grep -c '502" '` if [ $err -ge $N ] then /etc/init.d/php-fpm restart 2> /dev/null #設(shè)定60s延遲防止腳本bug導(dǎo)致無限重啟php-fpm服務(wù)? ? sleep 60 fi sleep 10done
4. 掃描主機(jī)端口狀態(tài)
#!/bin/bashHOST=$1PORT="22 80 8080 3306"for PORT in $PORT; do? ? if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then? ? ? ? echo "$PORT open"? ? else? ? ? ? echo "$PORT close"? ? fidone
5. 檢測兩臺服務(wù)器某個目錄下的文件一致性
#!/bin/bash######################################檢測兩臺服務(wù)器指定目錄下的文件一致性######################################通過對比兩臺服務(wù)器上文件的md5值河泳,達(dá)到檢測一致性的目的dir=/data/webb_ip=192.168.88.10#將指定目錄下的文件全部遍歷出來并作為md5sum命令的參數(shù)沃呢,進(jìn)而得到所有文件的md5值,并寫入到指定文件中find $dir -type f|xargs md5sum > /tmp/md5_a.txtssh $b_ip "find $dir -type f|xargs md5sum > /tmp/md5_b.txt"scp $b_ip:/tmp/md5_b.txt /tmp#將文件名作為遍歷對象進(jìn)行一一比對for f in `awk '{print 2} /tmp/md5_a.txt'`do#以a機(jī)器為標(biāo)準(zhǔn)拆挥,當(dāng)b機(jī)器不存在遍歷對象中的文件時直接輸出不存在的結(jié)果if grep -qw "$f" /tmp/md5_b.txtthenmd5_a=`grep -w "$f" /tmp/md5_a.txt|awk '{print 1}'`md5_b=`grep -w "$f" /tmp/md5_b.txt|awk '{print 1}'`#當(dāng)文件存在時薄霜,如果md5值不一致則輸出文件改變的結(jié)果if [ $md5_a != $md5_b ]thenecho "$f changed."fielseecho "$f deleted."fidone
6. 定時清空文件內(nèi)容,定時記錄文件大小
#!/bin/bash#################################################################每小時執(zhí)行一次腳本(任務(wù)計劃)竿刁,當(dāng)時間為0點或12點時黄锤,將目標(biāo)目錄下的所有文件內(nèi)容清空,但不刪除文件食拜,其他時間則只統(tǒng)計各個文件的大小鸵熟,一個文件一行,輸出到以時間和日期命名的文件中负甸,需要考慮目標(biāo)目錄下二級流强、三級等子目錄的文件################################################################logfile=/tmp/`date +%H-%F`.logn=`date +%H`if [ $n -eq 00 ] || [ $n -eq 12 ]then#通過for循環(huán),以find命令作為遍歷條件呻待,將目標(biāo)目錄下的所有文件進(jìn)行遍歷并做相應(yīng)操作for i in `find /data/log/ -type f`dotrue > $idoneelsefor i in `find /data/log/ -type f`dodu -sh $i >> $logfiledonefi
7. 查看局域網(wǎng)內(nèi)主機(jī)是否存活
#!/usr/bin/bash# check host statusfor i in {1..254}do? ? ? ? {? ? ip=192.168.8.$i? ? ping -c 2 -W 1 $ip &>/dev/null? ? if [ $? -eq 0 ];then? ? ? ? echo "$ip is online" | tee -a /tmp/host_online.txt? ? else? ? ? # echo "$ip is offline" | tee -a /tmp/host_offline.txt? ? ? echo "$ip is offline" &>/dev/null? ? fi? ? ? ? }&donewait
8. 自動應(yīng)答分發(fā)免密登錄
#!/usr/bin/bash# ssh keygen>ip_ok.txt>ip_false.txtuser=rootpasswd=123456rpm -qa | grep expect &>/dev/nullif [ $? -ne 0 ];then? echo "expect is not install"? yum -y install expectfiif [ ! -f ~/.ssh/id_rsa ];then? ssh-keygen -P "" -f ~/.ssh/id_rsafifor i in {15..30}do? {? ip=192.168.1."$i"? ping -c 1 -W1 "$ip"? if [ $? -eq 0 ];then? ? echo "$ip" >> ip_ok.txt? ? /usr/bin/expect <<-EOF? ? spawn ssh-copy-id $user@$ip? ? expect {? ? ? ? "yes/no" { send "yes\r"; exp_continue }? ? ? ? "password:" { send "$passwd\r" };? ? }? ? expect eof? ? ? ? EOF? else? ? echo "$ip" >>ip_false.txt? fi? }&donewaitecho "finish"
9. 代碼上線腳本
#!/bin/bash# code online# author: renPROJT_DIR=/usr/local/nginx/htmlOLD_DIR=/usr/local/nginx/html/web1PROJT=web1BACKUP_DIR=/data/backupDATA_CHMOD=wwwDATE=`date +%F`NEW_DIR=/data/web1# 關(guān)閉nginxfunction stop_nginx() {? /usr/bin/systemctl stop nginx? if [ $? -eq 0 ];then? ? echo "nginx is stopd"? else? ? echo "nginx is not stop please check..."? ? exit 1? fi}#2 備份原有數(shù)據(jù)function backup_data() {? if [ -d $BACKUP_DIR/$DATE'-'$PROJT ];then? ? echo "DIR $BACKUP_DIR/$DATE'-'$PROJT is exist"? ? exit 2? else? ? mv $OLD_DIR $BACKUP_DIR/$DATE'-'$PROJT? fi}# 3移動新的代碼 項目目錄? 注:此代碼目錄需手動上傳解壓 function new_code() {? if [ -d $NEW_DIR ];then? ? mv $NEW_DIR $PROJT_DIR? else? ? echo "NEW_DIR is not exist"? ? exit 3? fi}# 4 修改權(quán)限function chmod_news() {? chown -R $DATA_CHMOD.$DATA_CHMOD $OLD_DIR}# 5 啟動服務(wù)function start_nginx() {? /usr/bin/systemctl start nginx? if [ $? -eq 0 ];then? ? echo "nginx start ok"? else? ? echo "ngin is not start,please check..."? fi}stop_nginxbackup_datanew_codechmod_newsstart_nginx
10. 檢測MySQL主從復(fù)制是否異常
#!/bin/bashuser="root"password="123456"mycmd="mysql -u$user -p$password -h 192.168.1.88"function chkdb() {list=($($mycmd -e "show slave status \G"|egrep "Running|Behind"|awk -F: '{print $2}'))if [ ${list[0]} = "Yes" -a ${list[1]} = "Yes" -a ${list[2]} -lt 120 ]then echo "Mysql slave is ok"else echo "Mysql slave replation is filed"fi}function main() {while truedo chkdb? sleep 3done}main
11. MySQL數(shù)據(jù)庫備份腳本(mysqldump)
#!/bin/bash
#刪除15天以前備份
source /etc/profile? ? ? ? ? #加載系統(tǒng)環(huán)境變量
source ~/.bash_profile? ? #加載用戶環(huán)境變量
set -o nounset? ? ? ? ? ? #引用未初始化變量時退出
#set -o errexit? ? ? ? ? ? #執(zhí)行shell命令遇到錯誤時退出
user="root"
password="123456"
host="localhost"
port="3306"
#需備份的數(shù)據(jù)庫打月,數(shù)組
db=("test")
#備份時加鎖方式,
#MyISAM為鎖表--lock-all-tables蚕捉,
#InnoDB為鎖行--single-transaction
lock="--single-transaction"
mysql_path="/usr/local/mysql"
backup_path="${mysql_path}/backup"
date=$(date +%Y-%m-%d_%H-%M-%S)
day=15
backup_log="${mysql_path}/backup.log"
#建立備份目錄
if [ ! -e $backup_path ];then
? ? mkdir -p $backup_path
fi
#刪除以前備份
find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1
echo "開始備份數(shù)據(jù)庫:${db[*]}"
#備份并壓縮
backup_sql(){
? ? dbname=$1
? ? backup_name="${dbname}_${date}.sql"
? ? #-R備份存儲過程奏篙,函數(shù),觸發(fā)器
? ? mysqldump -h $host -P $port -u $user -p$password $lock --default-character-set=utf8 --flush-logs -R $dbname > $backup_path/$backup_name? ?
? ? if [[ $? == 0 ]];then
? ? ? ? cd $backup_path
? ? ? ? tar zcpvf $backup_name.tar.gz $backup_name
? ? ? ? size=$(du $backup_name.tar.gz -sh | awk '{print $1}')
? ? ? ? rm -rf $backup_name
? ? ? ? echo "$date 備份 $dbname($size) 成功 "
? ? else
? ? ? ? cd $backup_path
? ? ? ? rm -rf $backup_name
? ? ? ? echo "$date 備份 $dbname 失敗 "
? ? fi
}
#循環(huán)備份
length=${#db[@]}
for (( i = 0; i < $length; i++ )); do
? ? ? ? backup_sql ${db[$i]} >> $backup_log 2>&1
done
echo "備份結(jié)束,結(jié)果查看 $backup_log"
du $backup_path/*$date* -sh | awk '{print "文件:" $2 ",大小:" $1}'
作者:一個小運(yùn)維
鏈接:http://www.reibang.com/p/093d712c777d
來源:簡書
著作權(quán)歸作者所有迫淹。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)秘通,非商業(yè)轉(zhuǎn)載請注明出處。