工作中實用的Shell腳本實例

轉(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)載請注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敛熬,一起剝皮案震驚了整個濱河市肺稀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌应民,老刑警劉巖话原,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夕吻,死亡現(xiàn)場離奇詭異,居然都是意外死亡繁仁,警方通過查閱死者的電腦和手機(jī)涉馅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來改备,“玉大人控漠,你說我怎么就攤上這事⌒” “怎么了盐捷?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長默勾。 經(jīng)常有香客問我碉渡,道長,這世上最難降的妖魔是什么母剥? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任滞诺,我火速辦了婚禮,結(jié)果婚禮上环疼,老公的妹妹穿的比我還像新娘习霹。我一直安慰自己,他們只是感情好炫隶,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布淋叶。 她就那樣靜靜地躺著,像睡著了一般伪阶。 火紅的嫁衣襯著肌膚如雪煞檩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天栅贴,我揣著相機(jī)與錄音斟湃,去河邊找鬼。 笑死檐薯,一個胖子當(dāng)著我的面吹牛凝赛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坛缕,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼墓猎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祷膳?” 一聲冷哼從身側(cè)響起陶衅,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤屡立,失蹤者是張志新(化名)和其女友劉穎直晨,沒想到半個月后搀军,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勇皇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年罩句,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敛摘。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡门烂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兄淫,到底是詐尸還是另有隱情屯远,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布捕虽,位于F島的核電站慨丐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泄私。R本人自食惡果不足惜房揭,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晌端。 院中可真熱鬧捅暴,春花似錦、人聲如沸咧纠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惧盹。三九已至乳幸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钧椰,已是汗流浹背粹断。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留嫡霞,地道東北人瓶埋。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像诊沪,于是被迫代替她去往敵國和親养筒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容