我们业务在生产服务器运行,产生许多日志文件,磁盘空间有限,需要经常 手动清理,现在通过linux的crond服务实现,自动移动日志到指定目录。

一、通过脚本移动文件

1.使用vi命令创建一个脚本文件(我是在home目录下创建的):

创建脚本文件
touch mvfile.sh
编辑脚本文件
vi mvfile.sh

#! /bin/sh
find /home/opt/services/logs/ -name "*.log*" -exec mv {} /home/testbackup \;

这段命令的意思是,找到 /home/opt/services/logs/ 目录下 名字 是*.log* 的文件 移动到 /home/testbackup 目录下。

#! /bin/sh
find /home/opt/services/logs/ -mtime +3 -name "*.log*" -exec mv {} /home/testbackup \;

这段命令的意思是,找到 /home/opt/services/logs/ 目录下 名字 是*.log* 的文件 移动到 /home/testbackup 目录下,加 -mtime +3 这种方式设置当前时间前4天的文件,如下

#!/bin/sh
find /data/source -mtime +180 -type d -name "test*" -exec mv {} /opt/target  \;

脚本内容注释:find就是查找,找到/data/source这个目录下,所有当前时间180天之前的(-mtime +180),类型为目录(-type d),名称包含test前缀(-name “test*”)的所有目录,移动(mv)到/opt/target 目录下;

需要注意的是最后的目录名字 和 \ 之间一定要有一个空格 。否则会出现 find: 遗漏”-exec”的参数 这个错误。

2.保存退出,给脚本赋执行权限然后可以通过sh来执行脚本

chmod a+x movesftp.sh  
sh /home/mvlog.sh

3.检查服务器是否有crond服务

命令:service crond status
正常返回:crond (pid 30084) 正在运行…

如果没有正常返回:需要安装一下,命令如下
yum -y install vixie-cron
yum -y install crontabs

启动命令:
service crond start
停止命令:
service crond stop
重启命令:
service crond restart

4.设置定时任务

在定时任务列表中,直接编辑。使用如下命令:
命令:crontab -l #查看任务列表
命令:crontab -e #编辑任务列表

*/2 * * * * /bin/sh /home/mvlog.sh 

这里设置的是每2分钟执行一次。

* * * * * 命令。。。。
每个*对应的取值范围分别是:
0-59 分钟,0-23小时,1-31日,1-12月,0-7星期几。

更详细解释详情:Linux crond定时任务时间说明

5.wq保存退出,然后重启服务

命令:service crond restart。

注意:如果操作过过程中有提示权限的问题,记得时候root 权限,给文件开放权限。

如此就设置定时任务完成啦。但有一点必须谨慎,就是在执行定时任务列表操作保存时,会有提示告知,保存的定时任务命令必须正确,否则有错误就不能保存成功,且会影响或使之前其他的定时任务命令丢失失效!

还可以检查一下,定时任务是否是开机自启,方式服务器重启后失效!

chkconfig  --list crond               --查看crond是否开机自动启动
chkconfig  --level 35 crond on        --设置crond开机自动启动

二、crontab 实现每秒执行

linux crontab 命令,最小的执行时间是一分钟。如需要在小于一分钟内重复执行,可以有两个方法实现。

1.使用延时来实现每N秒执行

创建脚本文件:touch mvfile.sh
编辑脚本文件:vi mvfile.sh

#! /bin/sh
find /home/opt/services/logs/ -name "*.log*" -exec mv {} /home/testbackup \;

crontab -e 输入以下语句,然后 :wq 保存退出。

* * * * * php /home/fdipzone/php/crontab/tolog.php
* * * * * sleep 10; sh /home/mvfile.sh
* * * * * sleep 20; sh /home/mvfile.sh
* * * * * sleep 30; sh /home/mvfile.sh
* * * * * sleep 40; sh /home/mvfile.sh
* * * * * sleep 50; sh /home/mvfile.sh

原理:通过延时方法 sleep N 来实现每N秒执行。

注意:60必须能整除间隔的秒数(没有余数),例如间隔的秒数是2,4,6,10,12等。
如果间隔的秒数太少,例如2秒执行一次,这样就需要在crontab 加入60/2=30条语句。不建议使用此方法,可以使用下面介绍的第二种方法。

2.编写shell脚本实现

创建脚本文件:touch crontab.sh
编辑脚本文件:vi crontab.sh
给脚本赋权:chmod r+x crontab.sh

#!/bin/bash
step=2 #间隔的秒数,不能大于60
for (( i = 0; i < 60; i=(i+step) )); do
    $(sh '/home/mvfile.sh')
    sleep $step
done
exit 0

crontab -e 输入以下语句,然后:wq 保存退出。

# m h  dom mon dow   command
* * * * * sh /home/crontab.sh

原理:在sh使用for语句实现循环指定秒数执行。

注意:如果60不能整除间隔的秒数,则需要调整执行的时间。例如需要每7秒执行一次,就需要找到7与60的最小公倍数,7与60的最小公倍数是420(即7分钟)。
则 crontab.sh step的值为7,循环结束条件i<420, crontab -e可以输入以下语句来实现

# m h  dom mon dow   command
*/7 * * * * /home/crontab.sh
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐