日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

shell腳本實(shí)例,通向shell腳本大師的必經(jīng)之路

 印度阿三17 2019-08-10

概述

讀書百遍其義自見,shell腳本也是,只要例子看得多了,自然就知道怎么寫了。這里主要整理了20幾個例子,因?yàn)閮?nèi)容比較多,所以分了幾次來做介紹了。下面的實(shí)例最好先自己思考怎么去實(shí)現(xiàn),然后再看下實(shí)現(xiàn)的方式,答案不是標(biāo)準(zhǔn)的,也存在一些可以繼續(xù)完善的地方。


1、文件以日期命名,并寫入磁盤使用情況

#!/bin/bash 
#################################################
#文件以日期命名,并寫入磁盤使用情況
#################################################
d=`date %Y-%m-%d` ##獲取日期
logfile=$d.log ##定義日志文件名
df -h > $logfile ##向文件寫入磁盤使用情況
shell腳本實(shí)例,通向shell腳本大師的必經(jīng)之路

?


2、統(tǒng)計(jì)日志文件中各個IP的訪問量

1)、新建日志文件 ,文件名 1.txt

123 -sdfjukhesdjkfghjkldf 
456 -jsdigkhndjfgjd
789 -dsfjkdhfjkhsdjkfhsjk
123 -sdfhfjkhsjklaj
789 -jfgduhdjkfghjkdf
123 -dhsfgjkhsdjkghjkdf

2)腳本2.sh

#!/bin/bash
#################################################
##取文件IP|排序|去重并統(tǒng)計(jì)各個IP重復(fù)數(shù)量|排序
#################################################
awk '{print $1}' 1.txt |sort -n |uniq -c |sort -n
shell腳本實(shí)例,通向shell腳本大師的必經(jīng)之路

?


3.計(jì)算Linux系統(tǒng)所有進(jìn)程占用內(nèi)存之和

#!/bin/bash
#################################################
#計(jì)算Linux系統(tǒng)所有進(jìn)程占用內(nèi)存之和
#################################################
sum=0
#利用for循環(huán)調(diào)取每一項(xiàng)進(jìn)程所使用的內(nèi)存,并依次求和
for mem in `ps aux |awk '{print $6}' |grep -v 'RSS'`
do
sum=$[$sum $mem] ##內(nèi)存求和
done
echo "the usered mem $sum" ##輸出結(jié)果
shell腳本實(shí)例,通向shell腳本大師的必經(jīng)之路

?


4.監(jiān)控遠(yuǎn)程機(jī)器的存活,發(fā)現(xiàn)宕機(jī)示警

#!/bin/bash
#################################################
#監(jiān)控遠(yuǎn)程機(jī)器的存活,發(fā)現(xiàn)宕機(jī)示警
#################################################
#假設(shè)遠(yuǎn)程機(jī)器IP為114.114.114.114
ip=114.114.114.114
d=`date %Y-%m-%d` ##獲取日期
#while循環(huán)做循環(huán)監(jiān)控,"while :"為死循環(huán)
while :
do
#使用ping命令,取丟包率的數(shù)值作為存活的判斷依據(jù)
n=`ping -c2 $ip 2> /dev/null |grep 'received' |awk -F 'received, |%' '{print $2}'`
n1=`echo $n |sed 's/[0-9]//g'`
#判斷取值是否為空
if [ -z "$n" ]
then
echo "error"
exit
#判斷取值是否為數(shù)字
elif [ -n "$n1" ]
then
echo "error"
exit
#若丟包率不低于20%,則發(fā)送告警
elif [ $n -ge 20 ]
then
#這里也可做外發(fā)郵件告警
echo "more loss"
else
echo "$d : $ip is OK" > ip_monitor.log
fi
#監(jiān)控間隔為30秒
sleep 30
done
shell腳本實(shí)例,通向shell腳本大師的必經(jīng)之路

?


5.批量修改指定目錄下文件名、打包并還原文件名

#!/bin/bash
#################################################
#批量修改指定目錄下文件名、打包并還原文件名
#################################################
#將目標(biāo)文件夾下的所有指定類型文件的文件名查找存在指定文件中
find /home/scripts -type f -name "*.txt" > /home/scripts/txt.list
#通過for循環(huán)遍歷所有文件,并依次改名
for f in `cat /home/scripts/txt.list`
do
mv $f $f.bak
done
#定義一個時間命名的目錄作為打包文件的目錄
d=`date %F`
mkdir /home/scripts/txt_$d
#將所有改名文件依次拷貝到打包文件的目錄下
for f in `cat /home/scripts/txt.list`
do
cp $f.bak /home/scripts/txt_$d
done
#進(jìn)入指定目錄下進(jìn)行打包
cd /home/scripts
tar -czvf txt.tar.gz txt_$d
#還原文件名
for f in `cat /home/scripts/txt.list`
do
mv $f.bak $f
done

注:雖然打包的文件多了一層文件名,但是對于還原文件名變得十分容易

shell腳本實(shí)例,通向shell腳本大師的必經(jīng)之路

?

shell腳本實(shí)例,通向shell腳本大師的必經(jīng)之路

?


6.判斷本機(jī)80端口是否監(jiān)聽,如果不存在,則重啟服務(wù)并發(fā)送郵件告警

#!/bin/bash
###########################################################
#判斷本機(jī)80端口是否監(jiān)聽,如果不存在,則重啟服務(wù)并發(fā)送郵件告警
###########################################################
#判斷本機(jī)80端口是否監(jiān)聽,并執(zhí)行相應(yīng)動作(使用命令行作為判斷條件時,命令行正確執(zhí)行即滿足if條件,且用于判定的命令行不需要加反引號)
if netstat -ntpl |grep -q ':80 '
then
exit
else
#這里也可做外發(fā)郵件告警
echo "error"
#service nginx restart
fi
#判斷是否啟動成功,如未成功,則將錯誤信息通過郵件進(jìn)行告警
n=`pgrep -l httpd |wc -l` #列出所有httpd進(jìn)程的pid
if [ $n -eq 0 ]
then
touch /tmp/nginx_start.err
/usr/local/nginx/sbin/nginx start 2> /tmp/nginx_start.err
fi
if [ -s apache_start.err ] #if -s 選項(xiàng),文件大小非0時為真
then
#這里也可做外發(fā)郵件告警
echo "error"
fi

注:持續(xù)監(jiān)控可以采用任務(wù)計(jì)劃或while循環(huán)

shell腳本實(shí)例,通向shell腳本大師的必經(jīng)之路

?


7.多地備份數(shù)據(jù)庫(本地保留一周、遠(yuǎn)程保留一月)

#!/bin/bash
###########################################################
#多地備份數(shù)據(jù)庫(本地保留一周、遠(yuǎn)程保留一月)
#date %Y # 年份(四位) eg: 2018
#date %y # 年份后兩位 eg: 18
#date %m # 月 eg: 07
#date %d # 日 eg: 10
#date %H # 24小時 eg: 11
#date %M # 分 eg: 37
#date %S # 秒 eg: 24
#date %w # 星期(0-6) 0 表示周日
#date %F # 完整日期 =%Y-%m-%d
#date %T # =%H:%M:%S 時間 eg: 10:46:45
###########################################################
d1=date %w
d2=date %y-%m-d
bakdir='/backup'
r_bakdir='遠(yuǎn)程備份的IP地址':'遠(yuǎn)程備份的目錄' #通過ssh同步
rs_bakdir='遠(yuǎn)程備份的IP地址'::'模塊名稱' #通過服務(wù)同步
#定義接下來的命令涉及到的所有的正確輸出記錄在正確日志的目錄下,所有的錯誤輸出記錄在錯誤日志的目錄下
exec 1> '正確日志的目錄' 2>'錯誤日志的目錄'
echo "mysql backup begin at `date "%F %T"`"
#備份到本地機(jī)器的文件以星期命名,周期為7天,超出7天后,同名的舊文件會被新文件覆蓋
mysqldump -u'指定的用戶' -p'指定的密碼' '指定的數(shù)據(jù)庫' > $bakdir/$d1.sql
#備份到遠(yuǎn)程機(jī)器的文件以日期命名,周期為31天,超出31天后,同名的舊文件會被新文件覆蓋
rsync -az $bakdir/$d1.sql $r_bakdir/$d2.sql
echo "mysql backup end at `date "%F %T"`"
shell腳本實(shí)例,通向shell腳本大師的必經(jīng)之路

?


這些實(shí)際上是平時寫shell腳本的一個一個片段,主要是記住實(shí)現(xiàn)的方式,邏輯通就可以了,下次就知道怎么寫了。

來源:https://www./content-3-385301.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多