用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系统应用文件清理工具的更多相关文章

  1. Linux centosVMware运行告警系统、分发系统-expect讲解、自动远程登录后,执行命令并退出、expect脚本传递参数、expect脚本同步文件、指定host和要同步的文件、shell项目-分发系统-构建文件分发系统、分发系统-命令批量执行

    一运行告警系统 创建一个任务计划crontab -e 每一分钟都执行一次 调试时把主脚本里边log先注释掉 再次执行 没有发现502文件说明执行成功了,每日有错误,本机IP 负载不高 二.分发系统-e ...

  2. Linux系统重要文件(二)

    Linux系统重要文件概述 一系统自动挂载文件 文件路径信息:/etc/fstab文件作用说明:实现存储设备自动挂载 [root@centos7 ~]# cat /etc/fstab # # /etc ...

  3. Linux系统重要文件

    Linux系统重要文件介绍与配置 一网卡配置文件 (一)网卡配置文件参数介绍 文件路径信息:/ec/sysconfig/network-scripts/ifcfg-eth0 文件作用说明:配置网卡地址 ...

  4. Linux系统中文件定位与查找

    Linux系统中文件查找 关键词 文件查找 | find | locate 本文主要介绍有关文件查找的两个命令——find和locate,以及压缩打包的命令——compress, gzip,bzip2 ...

  5. 在 Linux 系统下使用 PhotoRec 工具来恢复已删除或丢失的文件

    PhotoRec – Recover Deleted or Lost Files in Linux 在 Linux 系统下使用 PhotoRec 工具来恢复已删除或丢失的文件 当你在系统中有意或无意地 ...

  6. shell项目-分发系统-构建文件分发系统

    shell项目-分发系统-构建文件分发系统 需求背景对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台.所以,自动同步文件是至关重要的. 实 ...

  7. Linux系统下文件压缩与打包命令

    Linux系统下文件压缩与打包命令 常用的压缩文件拓展名 * .Z * .zip * .gz * .bz2 * .xz * .tar * .tar.gz * .tar.bz2 * .tar.xz 压缩 ...

  8. 实验二:Linux系统简单文件操作命令

    項目 内容 这个作业属于哪个课程() 课程链接 这个作业的要求在哪里 实验要求 学号-姓名 17043133-木腾飞 作业学习目标 学习在Linux系统终端下进行命令行操作: 学习掌握常用命令行操作并 ...

  9. [转]linux 系统监控、诊断工具之 IO wait

    1.问题: 最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端.本机都没问题,但是没想到上了第二份日志之后,问题来了: 集群中的某台机器 top 看到负载巨高,集群中的机器 ...

随机推荐

  1. IOS解析XML

    XML也许是我们储存数据和通讯数据中最常见的一种简易方式,当我们来到XML的海洋时,我们会发现当我们用iPhone程序解析XML时,我们是有如此多的选项,让人眼花缭乱.iOS SDK本身就带有两种不同 ...

  2. jq操作img大小(动态修改)

    今天适配app页面是约到一个问题 当我们要显示后台传过来若干个尺寸不一的图片时,为了保证图片大小的一致性及比例的协调,需要动态改变图片显示尺寸. 通过搜索,我们可以从网上找到实现此功能的jQuery代 ...

  3. 安卓UDP通信

    功能: 实现了单次一发一收: import java.net.*; import java.io.*; public class udpRecv { /* * 创建UDP传输的接收端 * 1.建立ud ...

  4. phpcms的安装以及简单使用

    先来说一下phpcms的安装 首先从网上下个phpcms的压缩包,解压 解压后就是个这样的文件夹 这里要注意,下载的时候要放在平时存动态网页的那个地址,www目录下,如图 点开phpcms文件夹,里面 ...

  5. Ioc容器BeanPostProcessor-Spring 源码系列(3)

    Ioc容器BeanPostProcessor-Spring 源码系列(3) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Io ...

  6. centos安装UCenter 和 UCenter_Home

    1.搭建lamp环境yum  –y  install  httpd  php  php-mysql  mysql  mysql-server 2启动服务   3.设置服务开机自动启动 4.上传UCEN ...

  7. js设计模式--单体模式

    GOF里的23种设计模式, 也是在软件开发中早就存在并反复使用的模式. 如果程序员没有明确意识到他使用过某些模式, 那么下次他也许会错过更合适的设计 (这段话来自<松本行弘的程序世界>). ...

  8. NFS安装及配置

    NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系统能够彼此分享个 ...

  9. 批量删除的PHP

    第一个页面shanchu.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  10. ES6-01:常量与变量的声明

    首先,我们声明一个变量: //定义一个变量num,并赋值为10: let num = 10; //进行打印 console.log(num); let与var有所不同: 语法特点1:let变量只能在当 ...