用shell实现linux系统应用文件清理工具
用shell实现linux系统文件清理工具
1:原始需求
在系统运维中,会产生大量应用备份文件、落地文件等,这些文件需要定时清理。一般来说,都是使用crontab 拉起一个脚本来清理。类似这样:
30 0,12 * * * find /data02/rating_bak/loading -type f -name "gprs_ol*gz" -atime +1 -exec rm {} \;
但是如果机器很多,目录多,这种方式非常不利于管理,而且也没有一个清晰的配置,来知道什么机器上哪个目录的文件留存时间。这个工具用于在数据库中存一个配置,然后在每台机器上,配置一个定时脚本执行即可。
实现的基本方式为:用一个shell从数据库中读取配置,根据文件的最后修改时间,大于X的mv到带日期的子目录中,大于Y的压缩,大于Z的删除。用crontab拉起这个脚本。
2:数据库表配置
create table WH_BAKFILE_CFG
(
BAKID NUMBER, --主键ID
IP VARCHAR2(30), --IP地址
SCANPWD VARCHAR2(300), --扫描目录
BAKPWD VARCHAR2(300), --备份目录
FILECH VARCHAR2(100), --文件特征
MVTIME NUMBER, --文件移动时间 单位分
ZIPTIME NUMBER, --文件压缩时间 单位分
DELTIME number, --文件删除时间 单位分
Needcheck number --是否需要校验文件被占用 1需要校验
)
配置举例:
|
BAKID |
IP |
SCANPWD |
BAKPWD |
FILECH |
MVTIME |
ZIPTIME |
DELTIME |
NEEDCHECK |
|
91 |
172.20.31.24 |
/data02/rating_bak/upcheck/migrate_sd |
|
* |
1440 |
2880 |
46080 |
|
|
10 |
172.20.31.24 |
/app/billapp/user/wxk/mybak |
|
* |
1440 |
2880 |
8640 |
|
|
11 |
172.20.31.24 |
/data02/rating_bak/upfile/d |
|
* |
1440 |
5760 |
46080 |
|
|
13 |
172.20.31.24 |
/data02/rating_bak/upfile/q |
|
* |
1440 |
5760 |
46080 |
|
|
14 |
172.20.31.24 |
/data02/rating_bak/upfile/vpmn |
|
* |
1440 |
5760 |
46080 |
|
3:相关代码
A:读取配置,拉起处理shell。
从数据库中获取配置,写入${IP}.cfg,生成$(bakid).lock,避免处理shell被多次拉起,然后拉起处理shell。
#!/bin/sh
CONNSTR="conn dz/dz_xxxxx@nbilldb"
LOGFILE=./getbakinfo.log
##得到本机IP
IP=""
getip()
{
if [[ x"${IP}" = x ]];then
IP=`/sbin/ifconfig |grep "inet addr"| cut -f 2 -d ":" |sed -n '1p' |awk '{print $1}'`
fi
}
##记录日志
writelog()
{
echo `date +%Y-%m-%d" "%X` "$1" >>${LOGFILE}
}
##SQL
selectsql()
{
sqlplus -S /nolog <<EOF
set heading off feedback off pagesize 0 verify off echo off linesize 3000
${CONNSTR}
${1};
commit;
exit
EOF
}
MYWORKSHELL=$0
if [[ ${MYWORKSHELL} = "getbakinfo.sh" ]] ; then
MYWORKPATH=.
else
MYWORKPATH=${MYWORKSHELL%\/*}
fi
cd $MYWORKPATH
##判断连接
sql="select 'HELLOSMK' from dual"
selectresult=`selectsql "${sql}"`
if [[ ! "${selectresult}" = "HELLOSMK" ]] ; then
writelog "error 连接数据库失败!:${selectresult}"
else
##写配置文件
getip
rm ${IP}.cfg
sql="select trim(bakid)||'##'||trim(t.scanpwd)||'##'||trim(t.bakpwd)||'##'||trim(t.filech)||'##'||t.mvtime||'##'||t.ziptime||'##'||t.deltime||'##'||nvl(t.needcheck,0) \
from wh_bakfile_cfg t where t.ip ='${IP}' "
#selectsql "${sql}"
#IFS=$'\x0A'
selectresult=`selectsql "${sql}"`
##逐条处理
for result in ${selectresult}
do
bakid=`echo ${result} |awk -F "##" '{print $1}'`
scanpwd=`echo ${result} |awk -F "##" '{print $2}'`
bakpwd=`echo ${result} |awk -F "##" '{print $3}'`
filech=`echo ${result} |awk -F "##" '{print $4}'`
mvtime=`echo ${result} |awk -F "##" '{print $5}'`
ziptime=`echo ${result} |awk -F "##" '{print $6}'`
deltime=`echo ${result} |awk -F "##" '{print $7}'`
needcheck=`echo ${result} |awk -F "##" '{print $8}'`
echo ${bakid},${scanpwd},${bakpwd},${filech},${mvtime},${ziptime},${deltime},${needcheck}>>${IP}.cfg
done
fi
cat ${IP}.cfg |while read filestr
do
bakid=`echo ${filestr} |awk -F "," '{print $1}'`
scanpwd=`echo ${filestr} |awk -F "," '{print $2}'`
bakpwd=`echo ${filestr} |awk -F "," '{print $3}'`
filech=`echo ${filestr} |awk -F "," '{print $4}'`
mvtime=`echo ${filestr} |awk -F "," '{print $5}'`
ziptime=`echo ${filestr} |awk -F "," '{print $6}'`
deltime=`echo ${filestr} |awk -F "," '{print $7}'`
needcheck=`echo ${filestr} |awk -F "," '{print $8}'`
##目录检查
if [ -d "${scanpwd}" ] ; then
##锁检查
if [ ! -f "${bakid}.lock" ]; then
touch "${bakid}.lock"
nohup ${MYWORKPATH}/whbakfile.sh "${bakid}" "${scanpwd}" "${bakpwd}" "${filech}" "${mvtime}" "${ziptime}" "${needcheck}" "${MYWORKPATH}" "${deltime}" >> ${LOGFILE} 2>&1 &
fi
else
writelog "error目录不存在!:${scanpwd}"
fi
done
B:文件处理shell
#!/bin/sh
ddtime=`date +%Y%m%d`
LOGFILE=$HOME/log/bakfile/bakfile${ddtime}.log
bakid=$1
scanpwd=$2
bakpwd=$3
filech=$4
mvtime=$5
ziptime=$6
needcheck=$7
MYWORKPATH=$8
deltime=$9
cd $MYWORKPATH
##记录日志
writelog()
{
echo `date +%Y-%m-%d\ %H:%M:%S` "$1" >>${LOGFILE}
}
cd $MYWORKPATH
if [[ x"${bakpwd}" = x ]];then
bakpwd=${scanpwd}
fi
if [[ x"${deltime}" = x ]];then
deltime=9999999
fi
if [[ x"${ziptime}" = x ]];then
ziptime=9999999
fi
if [[ x"${filech}" = x ]];then
filech="*"
fi
###mv
find ${scanpwd} -maxdepth 1 -type f -name "${filech}" -mmin +${mvtime} |while read filename
do
filetime=`ls -l ${filename} --time-style '+%Y%m%d'|awk '{print $6}'`
if [ ! -d "${bakpwd}/${filetime}" ]; then
mkdir -p ${bakpwd}/${filetime}
fi
##check
checkstat=0
if [[ ${needcheck} -eq 1 ]] ; then
checkstat=`lsof|grep filename |wc -l`
fi
if [[ ${checkstat} -eq 0 ]] ; then
mv ${filename} ${bakpwd}/${filetime}
writelog "mv ${filename} ${bakpwd}/${filetime}"
fi
done
###gzip
if [[ ! ${ziptime} -eq 9999999 ]] ; then
find ${bakpwd} -type f -name "${filech}" -mmin +${ziptime}|grep -v .gz|grep ${bakpwd}/20|while read filename
do
gzip ${filename}
writelog "gzip ${filename}"
done
fi
###rm
if [[ ! ${deltime} -eq 9999999 ]] ; then
find ${bakpwd} -type f -name "${filech}" -mmin +${deltime}|grep ${bakpwd}/20|while read filename
do
rm ${filename}
writelog "rm ${filename}"
done
fi
##rmdir
if [[ ! ${deltime} -eq 9999999 ]] ; then
find ${bakpwd} -type d |grep ${bakpwd}/20|while read pathname
do
pathnum=`ls ${pathname} | wc -l`
if [[ ${pathnum} -eq 0 ]] ; then
rmdir ${pathname}
writelog "rmdir ${pathname}"
fi
done
fi
rm ${bakid}.lock
用shell实现linux系统应用文件清理工具的更多相关文章
- Linux centosVMware运行告警系统、分发系统-expect讲解、自动远程登录后,执行命令并退出、expect脚本传递参数、expect脚本同步文件、指定host和要同步的文件、shell项目-分发系统-构建文件分发系统、分发系统-命令批量执行
一运行告警系统 创建一个任务计划crontab -e 每一分钟都执行一次 调试时把主脚本里边log先注释掉 再次执行 没有发现502文件说明执行成功了,每日有错误,本机IP 负载不高 二.分发系统-e ...
- Linux系统重要文件(二)
Linux系统重要文件概述 一系统自动挂载文件 文件路径信息:/etc/fstab文件作用说明:实现存储设备自动挂载 [root@centos7 ~]# cat /etc/fstab # # /etc ...
- Linux系统重要文件
Linux系统重要文件介绍与配置 一网卡配置文件 (一)网卡配置文件参数介绍 文件路径信息:/ec/sysconfig/network-scripts/ifcfg-eth0 文件作用说明:配置网卡地址 ...
- Linux系统中文件定位与查找
Linux系统中文件查找 关键词 文件查找 | find | locate 本文主要介绍有关文件查找的两个命令——find和locate,以及压缩打包的命令——compress, gzip,bzip2 ...
- 在 Linux 系统下使用 PhotoRec 工具来恢复已删除或丢失的文件
PhotoRec – Recover Deleted or Lost Files in Linux 在 Linux 系统下使用 PhotoRec 工具来恢复已删除或丢失的文件 当你在系统中有意或无意地 ...
- shell项目-分发系统-构建文件分发系统
shell项目-分发系统-构建文件分发系统 需求背景对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台.所以,自动同步文件是至关重要的. 实 ...
- Linux系统下文件压缩与打包命令
Linux系统下文件压缩与打包命令 常用的压缩文件拓展名 * .Z * .zip * .gz * .bz2 * .xz * .tar * .tar.gz * .tar.bz2 * .tar.xz 压缩 ...
- 实验二:Linux系统简单文件操作命令
項目 内容 这个作业属于哪个课程() 课程链接 这个作业的要求在哪里 实验要求 学号-姓名 17043133-木腾飞 作业学习目标 学习在Linux系统终端下进行命令行操作: 学习掌握常用命令行操作并 ...
- [转]linux 系统监控、诊断工具之 IO wait
1.问题: 最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端.本机都没问题,但是没想到上了第二份日志之后,问题来了: 集群中的某台机器 top 看到负载巨高,集群中的机器 ...
随机推荐
- twemproxyRedis协议解析探索——剖析twemproxy代码正编
这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是 ...
- 使用PMD进行代码审查
很久没写博客了,自从上次写的设计模式的博客被不知名的鹳狸猿下架了一次之后兴趣大减,那时候就没什么兴致写博客了,但是这段时间还没有停下来,最近也在研究一些其他的东西,目前有点想做点东西的打算,但好像也没 ...
- css 样式重置
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, ...
- json基础教程|理解Json
一. 在异步应用程序中发送和接收信息时,可以选择以纯文本和 XML 作为数据格式.这一期讨论一种有用的数据格式 JavaScript Object Notation(JSON),以及如何使用它更轻松地 ...
- Swift 面向对象解析(二)
接着上面一篇说的内容: 一 继承: 苹果继承与水果,苹果是水果的子类,则苹果是一种特殊的水果:这就是继承的关系,这个我们学OC的时候相信也都理解了,就不再描述定义了,下面的就叫继承: class ZX ...
- 检查浏览器url改变,处理ajax前进和后退键
在用ajax获取数据,不刷新页面情况下,保持前进后退按钮功能,网页端兼容性最好的方式如下: 首先url后面参数用# 如http://www.xxx.com/#txf; 使用改变location.ha ...
- 读书笔记 effective c++ Item 17 使用单独语句将new出来的对象放入智能指针
1. 可能会出现资源泄漏的一种用法 假设我们有一个获取进程优先权的函数,还有一个在动态分类的Widget对象上根据进程优先权进行一些操作的函数: int priority(); void proces ...
- [Android] "Failed to find Java version for 'C:\Windows\system32\java.exe"
Impossible to install SDK r17 on win 7 x64 "Failed to find Java version for 'C:\Windows\system3 ...
- 关于boostrap的thead固定tbody滚动
原文地址:http://blog.csdn.net/bbsyi/article/details/51126041# 1 <!DOCTYPE html> 2 <html> 3 & ...
- Ant学习总结1
一.Ant简介 Ant是用来编译/运行/测试java程序,构建.包装和发布过程中几乎每一件事都可以由Ant的任务来处理. 二.Ant管理项目 当开始一个新的项目时,首先应该编写Ant的构建文件, ...