详细分析crontab定时执行任务(附Demo | 定时清空Tomcat的实战)

目录

  • 前言
  • [1. 基本知识](#1. 基本知识)
  • [2. Demo](#2. Demo)
  • [3. 实战](#3. 实战)
    • [3.1 错误版本](#3.1 错误版本)
    • [3.2 正确版本](#3.2 正确版本)

前言

由于用户量大,且导出的日志以及缓存特别多,急需定期删除文件

1. 基本知识

crontab 是一个用于定时执行任务的命令行工具,通常在 Unix 和类 Unix 系统中可用,表示一个包含需要定时执行的任务列表的表格

基本语法如下:

  • 通常以 -e 参数启动,用于编辑用户的 crontab 文件
  • crontab 文件由一系列任务组成,每个任务占据一行
  • 每行任务的格式为:分 时 日 月 周 命令,各字段之间用空格分隔
    分:分钟数(0-59)
    时:小时数(0-23)
    日:日期(1-31)
    月:月份(1-12)
    周:星期几(0-7,其中0和7表示星期日)
    命令:要执行的命令或脚本

需要注意的事项如下:

  • 每个用户都可以有自己的 crontab 文件

  • crontab 文件的路径通常是 /var/spool/cron/crontabs/用户名

  • 使用 crontab -e 编辑 crontab 文件时,会自动打开一个文本编辑器,如 vi 或 nano

  • 保存和退出编辑器后,新的 crontab 文件会立即生效,无需重启 cron 服务

文件的特殊字符如下:

  • *:代表任意值,通常用于不限制该字段的取值范围
  • -:代表范围,如 1-5 表示1到5
  • ,:代表枚举值,如 1,3,5 表示1、3、5
  • /:代表步长,如 */10 表示每隔10
  • @reboot:表示在系统启动时执行一次任务
  • @yearly、@annually、@monthly、@weekly、@daily、@midnight、@hourly:这些是预定义的时间间隔,分别表示每年、每月、每周、每天、每天午夜、每小时

crontab基本的命令如下:

  • crontab -l:查看当前用户的 crontab 文件内容。
  • crontab -e:编辑当前用户的 crontab 文件。
  • crontab -r:删除当前用户的 crontab 文件

2. Demo

示例 1:每小时备份文件

每小时备份某个目录中的文件到另一个目录,可以设置两个不同的任务来执行备份操作

bash 复制代码
# 每小时备份文件
0 * * * * /usr/bin/rsync -avz /path/to/source/ /path/to/backup/

示例 2:每天早上清理日志文件

每天早上6点清理某个目录中的日志文件,可以设置一个定时任务来执行清理操作

bash 复制代码
# 每天早上6点清理日志文件
0 6 * * * /bin/find /path/to/logs/ -type f -mtime +7 -exec /bin/rm {} \;

示例 3:每周日备份数据库

希望每周日凌晨3点备份数据库,可以设置一个定时任务来执行备份操作

bash 复制代码
# 每周日凌晨3点备份数据库
0 3 * * 0 /usr/bin/mysqldump -u username -pPassword dbname > /path/to/backup/db_backup.sql

示例 4:每月第一天生成报告

需要在每个月的第一天生成一个报告,可以设置一个定时任务来执行报告生成操作

bash 复制代码
# 每月第一天生成报告
0 0 1 * * /usr/bin/python /path/to/script/generate_report.py

示例 5:每小时检查服务器状态

希望每小时检查一次服务器的状态并将结果记录到日志文件,可以设置一个定时任务来执行检查操作

bash 复制代码
# 每小时检查服务器状态
0 * * * * /usr/bin/bash /path/to/script/check_server_status.sh >> /var/log/server_status.log 2

3. 实战

以定期删除Tomcat日志文件为基础

由于tomcat在运行时无法删除logs文件,所以需要单独弄个脚本

错误版本为上述Demo的操作

3.1 错误版本

  • 文件编辑:crontab -e

添加定时任务:

bash 复制代码
0 0 * * * find /usr/local/tomcat/apache-tomcat-7.0.85/logs -mtime +1 -exec rm -rfv {} \;
0 0 * * * find /usr/local/tomcat/apache-tomcat-7.0.85/temp/bdf2-export-temp/ -mtime +1 -exec rm -rfv {} \;

截图如下:

确保crontab 任务已正确配置,可以使用以下命令查看当前用户的定时任务:crontab -l

为了方便后续处理,也可使用如下方式做一个归类:

在某个位置设置一个脚本文件,记住脚本文件名以及路径:

bash 复制代码
#!/bin/bash
export LANG=zh_CN
#tomcat日志文件路径
export WEB_TOMCAT1=/usr/local/tomcat/apache-tomcat-7.0.85/logs
echo > ${WEB_TOMCAT}/catalina.out
find ${WEB_TOMCAT}/* -mtime +7 -type f -exec rm -f {} \;

截图如下:

设置脚本可执行chmod a+x cleanTomcatlog.sh

编辑用户的 crontab 文件crontab -e

添加定时任务30 04 * * * /usr/local/script/cleanTomcatlog.sh

3.2 正确版本

编制正确的删除脚本:(定期删除一天前的日志)

-mtime +1表示查找超过一天前修改的文件。如果你需要精确匹配前一天的文件,可以使用-mtime 1。但是,通常情况下,-mtime +1已经可以删除超过一天的旧文件

html 复制代码
#!/bin/bash
logs_path="/usr/local/tomcat/apache-tomcat-7.0.85/logs"
temp_path="/usr/local/tomcat/apache-tomcat-7.0.85/temp/bdf2-export-temp"

# 定时清理超过1天的Tomcat日志脚本
find $logs_path -mtime +1 -name "localhost_access_log.*.txt" -exec rm -rf {} \;
find $logs_path -mtime +1 -name "localhost.*.log" -exec rm -rf {} \;
find $logs_path -mtime +1 -name "catalina.*.log" -exec rm -rf {} \;
find $logs_path -mtime +1 -name "manager.*.log" -exec rm -rf {} \;
find $logs_path -mtime +1 -name "host-manager.*.log" -exec rm -rf {} \;
find $logs_path -mtime +1 -name "catalina.out" -exec rm -rf {} \;
>$logs_path/catalina.out;

# 定时清理超过1天的临时导出文件
find $temp_path -mtime +1 -name "*.xls" -exec rm -rf {} \;

为了让其定期执行,正确还是结合crontab来操作:crontab -e

截图如下:

对于文件的匹配规则,最好观察下格式

有些可能多个

html 复制代码
find $logs_path -mtime 1 -name "catalina.out.*" -exec rm -rf {} \;
相关推荐
步行cgn11 小时前
MyBatis 动态 SQL 完全指南
sql·tomcat·mybatis
SemiTris1 天前
从Controller到Tomcat底层请求链路全解析
java·tomcat
程序员良辰2 天前
【TongWeb8】使用 Crontab 定时重启和检测 TongWeb 服务
java·中间件·tomcat
上海云盾商务经理杨杨2 天前
Tomcat 弱配置漏洞渗透实战!批量 getshell 高频漏洞
java·web安全·tomcat
凤山老林4 天前
Spring Boot 定时任务进阶:动态 Cron 与集群防重实战
java·spring boot·后端·定时任务·集群定时任务
小张同学a.6 天前
zabbix企业级监控平台3——服务监控与API实战
linux·运维·mysql·nginx·tomcat·zabbix
xxwl58512 天前
数据库后端接口测试报告
spring boot·mysql·tomcat
次次皮14 天前
Linux 下通过 XShell 手动更新 Tomcat 应用并重启
前端·tomcat·jar
仙逆GPT14 天前
Codex定时任务怎么设置?ChatGPT Plus用Worktree自动巡检项目
chatgpt·定时任务·codex·git worktree·chatgpt plus
CodexDave15 天前
Python 自动化接单实战(七):定时报告如何保证同一天只生成一次
python自动化·定时任务·报表生成·幂等执行