案例一、 自定義刪除版本庫目錄
線上業務系統版本在版本機上的存放目錄為/opt/data/ONLINE,目錄結構為: /opt/data/ONLINE/系統名稱/應用名稱/版本號,版本號是以日期(年月日)8位數字命令的。
查看業務系統
[root@localhost ONLINE]# ll /opt/data/ONLINE/
total 60
drwxr-xr-x 17 root root 4096 Dec 12 13:11 AFG
drwxr-xr-x 10 root root 4096 Dec 12 13:09 AFS
drwxr-xr-x 17 root root 4096 Dec 12 13:11 BAU
drwxr-xr-x 17 root root 4096 Dec 12 13:11 CCD
drwxr-xr-x 10 root root 4096 Dec 12 13:09 EFE
drwxr-xr-x 17 root root 4096 Dec 12 13:11 ERU
drwxr-xr-x 17 root root 4096 Dec 12 13:11 HUU
drwxr-xr-x 10 root root 4096 Dec 12 13:09 IFI
drwxr-xr-x 10 root root 4096 Dec 12 13:09 IOO
drwxr-xr-x 17 root root 4096 Dec 12 13:11 JKL
drwxr-xr-x 17 root root 4096 Dec 12 13:11 KPO
drwxr-xr-x 17 root root 4096 Dec 12 13:11 NFA
drwxr-xr-x 10 root root 4096 Dec 12 13:09 OOS
drwxr-xr-x 17 root root 4096 Dec 12 13:11 QJK
drwxr-xr-x 10 root root 4096 Dec 12 13:09 UPP
查看每個業務系統下的應用模塊
[root@localhost ONLINE]# ll /opt/data/ONLINE/*/
比如查看AFG系統下的應用模塊
[root@localhost ONLINE]# ll /opt/data/ONLINE/AFG
total 60
drwxr-xr-x 17 root root 4096 Dec 13 11:45 bacm
drwxr-xr-x 17 root root 4096 Dec 13 11:45 bay_uo
drwxr-xr-x 17 root root 4096 Dec 13 11:45 habnat
drwxr-xr-x 17 root root 4096 Dec 13 11:45 her
drwxr-xr-x 17 root root 4096 Dec 13 11:45 kio_pro
drwxr-xr-x 17 root root 4096 Dec 13 11:45 mod_bank
drwxr-xr-x 17 root root 4096 Dec 13 11:45 mpb_fos
drwxr-xr-x 17 root root 4096 Dec 13 11:45 namp_qs
drwxr-xr-x 17 root root 4096 Dec 13 11:45 pay_core
drwxr-xr-x 17 root root 4096 Dec 13 11:45 poo_kat
drwxr-xr-x 17 root root 4096 Dec 13 11:45 sand
drwxr-xr-x 17 root root 4096 Dec 13 11:45 sanf_pat
drwxr-xr-x 17 root root 4096 Dec 13 11:45 sans
drwxr-xr-x 17 root root 4096 Dec 13 11:45 werq
drwxr-xr-x 17 root root 4096 Dec 13 11:45 yar_kl
查看業務系統下應用模塊的版本庫
[root@localhost ONLINE]# ls /opt/data/ONLINE/*/*
比如查看AFG系統下的bacm應用的版本庫
[root@localhost ONLINE]# ll /opt/data/ONLINE/AFG/bacm/
total 60
drwxr-xr-x 2 root root 4096 Dec 13 11:45 20190102
drwxr-xr-x 2 root root 4096 Dec 13 11:45 20190103
drwxr-xr-x 2 root root 4096 Dec 13 11:45 20190104
drwxr-xr-x 2 root root 4096 Dec 13 11:45 20190105
drwxr-xr-x 2 root root 4096 Dec 13 11:45 20190106
drwxr-xr-x 2 root root 4096 Dec 13 11:45 20190107
drwxr-xr-x 2 root root 4096 Dec 13 11:45 20190108
drwxr-xr-x 2 root root 4096 Dec 13 11:45 20190202
drwxr-xr-x 2 root root 4096 Dec 13 11:37 20190203
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190204
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190205
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190207
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190210
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190211
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190212
=====================================================================================
現在需要清理版本庫/opt/data/ONLINE的空間,即刪除各業務系統下的版本號,只保留最近7天的
版本號數據。
腳本如下:
[root@localhost ~]# cat /opt/data/script/del_online_Sysname_version.sh
#!/bin/sh
#scriptname:del_online_Sysname_version.sh
#author:kevin
#time:2018:12:01
#保留的版本號數量
# read -p "請輸入版本號刪除后保留的份數: " keepnum
keepnum=7
#記錄各系統刪除的版本號
LogPath=/opt/data/script/version_clear.log
Online_Version_Path=/opt/data/ONLINE
#注意這里的${Online_Version_Path}/*,后面用-maxdepth 0,表示搜索${Online_Version_Path}目錄下的那一層目錄
#如果是${Online_Version_Path}/,即后面不加*,則后面要用-maxdepth 1,表示搜索${Online_Version_Path}目錄下的那一層目錄
for Sysname in $(find ${Online_Version_Path}/* -maxdepth 0 -type d|awk -F"/" '{print $NF}')
do
echo -e "`date +"%Y-%m-%d %H:%M:%S"`: ########### 開始清理${Sysname}版本號目錄${Online_Version_Path}/${Sysname} ###########">> ${LogPath}
for Appname in `find ${Online_Version_Path}/${Sysname}/* -maxdepth 0 -type d|awk -F"/" '{print $NF}'`
do
echo -e "`date +"%Y-%m-%d %H:%M:%S"`: 開始清理${Sysname}的應用${Appname}下的版本號" >> ${LogPath}
#grep "^[0-9]\{8,8\}"表示以數字開頭,連續出現8個數字。
#ls -lrt ${Appname} 會以目錄時間降序排列。即前面五個目錄是最新的。默認最新的都放在后面。
#這里只需要統計目錄總數量,所以用ls -l即可
Before_Del_version_Num=$(ls -l ${Online_Version_Path}/${Sysname}/${Appname} |grep ^d|awk '{ print $NF }'|grep "^[0-9]\{8,8\}"|wc -l)
Del_version_Num=$(`which expr` ${Before_Del_version_Num} - ${keepnum})
#開始清理版本
for Del_version in $(ls -l ${Online_Version_Path}/${Sysname}/${Appname} |grep ^d|awk '{ print $NF }'|grep "^[0-9]\{8,8\}"|sed -n "1,${Del_version_Num}p")
do
cd ${Online_Version_Path}/${Sysname}/${Appname} && rm -rf ${Del_version}
if [ $? -eq 0 ];then
echo "`date +"%Y-%m-%d %H:%M:%S"`: 開始清理版本,${Del_version}已被成功刪除!"|tee -a ${LogPath}
fi
done
done
done
執行腳本:
[root@localhost ~]# chmod 755 /opt/data/script/del_online_Sysname_version.sh
[root@localhost ~]# sh /opt/data/script/del_online_Sysname_version.sh
查看執行日志:
[root@localhost ~]# cat /opt/data/script/version_clear.log
2019-12-13 11:53:40: ########### 開始清理AFG版本號目錄/opt/data/ONLINE/AFG ###########
2019-12-13 11:53:40: 開始清理AFG的應用bacm下的版本號
2019-12-13 11:53:40: 開始清理版本,20190102已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190103已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190104已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190105已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190106已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190107已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190108已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190202已被成功刪除!
2019-12-13 11:53:40: 開始清理AFG的應用bay_uo下的版本號
2019-12-13 11:53:40: 開始清理版本,20190102已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190103已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190104已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190105已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190106已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190107已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190108已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190202已被成功刪除!
2019-12-13 11:53:40: 開始清理AFG的應用habnat下的版本號
2019-12-13 11:53:40: 開始清理版本,20190102已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190103已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190104已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190105已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190106已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190107已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190108已被成功刪除!
2019-12-13 11:53:40: 開始清理版本,20190202已被成功刪除!
2019-12-13 11:53:41: 開始清理AFG的應用her下的版本號
2019-12-13 11:53:41: 開始清理版本,20190102已被成功刪除!
.........
.........
驗證腳本執行后,各系統的版本號是否保留了最近7天的數據
[root@localhost ~]# ll /opt/data/ONLINE/*/*|head -50
/opt/data/ONLINE/AFG/bacm:
total 28
drwxr-xr-x 2 root root 4096 Dec 13 11:37 20190203
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190204
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190205
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190207
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190210
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190211
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190212
/opt/data/ONLINE/AFG/bay_uo:
total 28
drwxr-xr-x 2 root root 4096 Dec 13 11:37 20190203
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190204
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190205
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190207
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190210
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190211
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190212
/opt/data/ONLINE/AFG/habnat:
total 28
drwxr-xr-x 2 root root 4096 Dec 13 11:37 20190203
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190204
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190205
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190207
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190210
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190211
drwxr-xr-x 2 root root 4096 Dec 12 13:16 20190212
.........
.........
發現通過上面腳本的執行,各業務系統的版本號成功被清理了,並正確保留了最近7天的數據!
案例二、自定義刪除日志目錄
線上某些業務系統的日志不定期產生, 有的每天產生, 有的好幾天才產生, 因為系統只有在用的時候才產生日志,日志文件均存放在以當天日期命名的目錄下. 當日志目錄越來越多時就需要處理, 由此開發同事提出來一個需求, 需要一個自定義刪除或保留這些日志目錄的腳本。
[root@localhost pay-sign-oper]# ls 2018-09-13 2018-09-20 2018-10-11 2018-10-28 2018-11-02 2018-11-14 2018-12-04 2018-12-09 2018-09-14 2018-09-27 2018-10-24 2018-10-29 2018-11-06 2018-11-15 2018-12-05 2018-12-10 2018-09-15 2018-09-29 2018-10-25 2018-10-30 2018-11-07 2018-11-30 2018-12-06 2018-12-11 2018-09-17 2018-09-30 2018-10-26 2018-10-31 2018-11-08 2018-12-02 2018-12-07 2018-12-12 2018-09-19 2018-10-08 2018-10-27 2018-11-01 2018-11-09 2018-12-03 2018-12-08 pay-sign-oper.log [root@localhost pay-sign-oper]# ls 2018-09-13/ pay-sign-oper.2018-09-13.log [root@localhost pay-sign-oper]# ls 2018-12-12/ pay-sign-oper.2018-12-12.log 比如現在開發同事想要刪除2018年11月08號之前的日志, 現在就需要一個智能腳本, 用來一鍵實現這個需求.
腳本內容如下:
[root@localhost pay-sign-oper]# cat date_log_delete.sh
#!/bin/bash
echo -n "請輸入日期, 截止到該日期之前的日志目錄接下來將要被刪除:"
read date1
date2=$(echo ${date1}|awk -F"-" '{print $1$2$3}')
cd `pwd`
for date3 in $(ls -l|grep "drwxr"|awk '{print $9}'|awk -F"-" '{print $1$2$3}')
do
a=$(echo ${date3}|cut -c 1-4)
b=$(echo ${date3}|cut -c 5-6)
c=$(echo ${date3}|cut -c 7-8)
date4=$(echo ${a}-${b}-${c})
if [ ${date3} -lt ${date2} ];then
rm -rf ${date4} && echo "deleted ${date4}"
else
echo "${date4} do not need to delete"
fi
done
授予腳本執行權限
[root@localhost pay-sign-oper]# chmod 755 date_log_delete.sh
[root@localhost pay-sign-oper]# ll date_log_delete.sh
-rwxr-xr-x 1 root root 557 Dec 13 14:50 date_log_delete.sh
比如現在想要刪除2018年9月27號之前的日志, 則腳本執行后, 按照提示輸入:2018-09-27 即可實現:
[root@localhost pay-sign-oper]# sh date_log_delete.sh 請輸入日期, 截止到該日期之前的日志目錄接下來將要被刪除:2018-09-27 deleted 2018-09-13 deleted 2018-09-14 deleted 2018-09-15 deleted 2018-09-17 deleted 2018-09-19 deleted 2018-09-20 2018-09-27 do not need to delete 2018-09-29 do not need to delete 2018-09-30 do not need to delete 2018-10-08 do not need to delete 2018-10-11 do not need to delete 2018-10-24 do not need to delete 2018-10-25 do not need to delete 2018-10-26 do not need to delete 2018-10-27 do not need to delete 2018-10-28 do not need to delete 2018-10-29 do not need to delete 2018-10-30 do not need to delete 2018-10-31 do not need to delete 2018-11-01 do not need to delete 2018-11-02 do not need to delete 2018-11-06 do not need to delete 2018-11-07 do not need to delete 2018-11-08 do not need to delete 2018-11-09 do not need to delete 2018-11-14 do not need to delete 2018-11-15 do not need to delete 2018-11-30 do not need to delete 2018-12-02 do not need to delete 2018-12-03 do not need to delete 2018-12-04 do not need to delete 2018-12-05 do not need to delete 2018-12-06 do not need to delete 2018-12-07 do not need to delete 2018-12-08 do not need to delete 2018-12-09 do not need to delete 2018-12-10 do not need to delete 2018-12-11 do not need to delete 2018-12-12 do not need to delete 腳本執行看, 查看, 發現2018年9月27號之前的日志和日志目錄都被刪除了. [root@localhost pay-sign-oper]# ls 2018-09-27 2018-10-11 2018-10-27 2018-10-31 2018-11-07 2018-11-15 2018-12-04 2018-12-08 2018-12-12 2018-09-29 2018-10-24 2018-10-28 2018-11-01 2018-11-08 2018-11-30 2018-12-05 2018-12-09 date_log_delete.sh 2018-09-30 2018-10-25 2018-10-29 2018-11-02 2018-11-09 2018-12-02 2018-12-06 2018-12-10 pay-sign-oper.log 2018-10-08 2018-10-26 2018-10-30 2018-11-06 2018-11-14 2018-12-03 2018-12-07 2018-12-11
以上腳本看起來非常好用, 非常智能! 此腳本可以在任何這樣的日志場景下使用. 下面針對腳本中涉及到的一些shell小腳本進行拆分說明:
1)
echo -n "請輸入日期, 截止到該日期之前的日志目錄接下來將要被刪除:"
read date1
上面兩行腳本內容用到了shell腳本中的read參數.
read參數表示接收標准輸入(鍵盤)的輸入,或其他文件描述符的輸入。
得到輸入內容后,read參數將該內容傳遞到一個標准變量中。
也就是腳本執行后提示輸入的日期, 並將該日期傳給${date1}變量
2)
date2=$(echo ${date1}|awk -F"-" '{print $1$2$3}')
這一行腳本內容是將輸入的日期的格式轉變成數字格式, 並傳給變量${date2}, 是為了和后面的變量${date3}做if語句中的大小判斷之用.
比如: 腳本執行后提示輸入的內容是2018-09-27, 這個也就是變量${date1}的數值. 則變量${date}的值就是20180927.
[root@localhost pay-sign-oper]# echo 2018-09-27|awk -F"-" '{print $1$2$3}'
20180927
3)
cd `pwd`
這一行腳本內容表示切換到當前目錄路徑下 (其實可以不寫這一行, 因為腳本文件就在當前目錄下)
4)
for date3 in $(ls -l|grep "drwxr"|awk '{print $9}'|awk -F"-" '{print $1$2$3}')
這一行腳本內容表示在當前目錄下取日期目錄, 並將該日期目錄的格式轉變成數字形式, 並傳給變量${date3}, 是為了和${date2}做if語句中的大小判斷之用. 如下:
[root@localhost pay-sign-oper]# ls -l
total 136
drwxr-xr-x 2 root root 4096 Dec 13 14:56 2018-09-27
drwxr-xr-x 2 root root 4096 Dec 13 14:56 2018-09-29
drwxr-xr-x 2 root root 4096 Dec 13 14:55 2018-09-30
drwxr-xr-x 2 root root 4096 Dec 13 14:55 2018-10-08
...........
...........
drwxr-xr-x 2 root root 4096 Dec 13 12:40 2018-12-10
drwxr-xr-x 2 root root 4096 Dec 13 12:40 2018-12-11
drwxr-xr-x 2 root root 4096 Dec 13 12:40 2018-12-12
-rwxr-xr-x 1 root root 557 Dec 13 14:50 date_log_delete.sh
-rw-r--r-- 1 root root 0 Dec 13 12:40 pay-sign-oper.log
[root@localhost pay-sign-oper]# ls -l|grep "drwxr"|awk '{print $9}'
2018-09-27
2018-09-29
2018-09-30
2018-10-08
...........
...........
2018-12-10
2018-12-11
2018-12-12
[root@localhost pay-sign-oper]# ls -l|grep "drwxr"|awk '{print $9}'|awk -F"-" '{print $1$2$3}'
20180927
20180929
20180930
20181008
...........
...........
20181210
20181211
20181212
5)
a=$(echo ${date3}|cut -c 1-4)
b=$(echo ${date3}|cut -c 5-6)
c=$(echo ${date3}|cut -c 7-8)
這三行腳本內容表示提取一個數字字符串中的某幾位. a , b, c 三個變量分別表示取變量${date3}數字中的第1-4位, 第5-6位, 第7-8位.
比如變量${date3}的數值是20180927, 則:
[root@localhost pay-sign-oper]# echo 20180927|cut -c 1-4
2018
[root@localhost pay-sign-oper]# echo 20180927|cut -c 5-6
09
[root@localhost pay-sign-oper]# echo 20180927|cut -c 7-8
27
6) date4=$(echo ${a}-${b}-${c})
這一行腳本內容表示將變量${date3}的數值拆分后再組成日期格式. 為了后面做if語句中的判斷結果后的日期目錄刪除操作.
7)
if [ ${date3} -lt ${date2} ];then
rm -rf ${date4} && echo "deleted ${date4}"
else
echo "${date4} do not need to delete"
fi
上面的腳本內容表示if語句中判斷,:
當變量${date3}數值小於變量${date2}的數值時, 就刪除變量${date4}的日期目錄,並打印刪除信息.
當變量${date3}數值大於等於變量${date2}的數值時, 就打印不要刪除的信息.
