在 Linux 中,定时任务(cron)

在Linux中,定时任务(cron)的灵活性在于通过时间字段的组合和命令的搭配,可适应多种场景。以下是一个包含不同典型场景的crontab示例,涵盖了周期性执行、特定时间点执行、结合脚本、输出处理等常见需求:

示例crontab配置(通过crontab -e编辑)

bash 复制代码
# 1. 每天凌晨2:30自动备份MySQL数据库,并重定向输出到日志文件
30 2 * * * /usr/bin/mysqldump -u root -p'密码' 数据库名 > /backup/db_$(date +\%Y\%m\%d).sql 2>> /var/log/db_backup.log

# 2. 每周日凌晨3点清理/var/log目录下7天前的日志文件
0 3 * * 0 /usr/bin/find /var/log -name "*.log" -mtime +7 -delete >> /var/log/log_cleanup.log 2>&1

# 3. 每月1日上午10点生成上月服务器性能统计报告,并发送到指定邮箱
0 10 1 * * /usr/local/bin/stat_report.sh $(date -d 'last month' +\%Y) $(date -d 'last month' +\%m) | mail -s "上月性能报告" admin@example.com

# 4. 每小时的第15分钟检查Nginx服务状态,若停止则自动重启
15 * * * * /usr/bin/systemctl is-active nginx || /usr/bin/systemctl restart nginx

# 5. 工作日(周一至周五)下午5点执行数据同步脚本
0 17 * * 1-5 /data/scripts/sync_data.sh > /dev/null 2>&1

逐条解释说明

1. 每日数据库备份
bash 复制代码
30 2 * * * /usr/bin/mysqldump ... 
  • 时间字段30 2 * * * 表示"每天凌晨2点30分"

    • 30:分钟(0-59)
    • 2:小时(0-23,2即凌晨2点)
    • *:日(任意天)
    • *:月(任意月)
    • *:周(任意周)
  • 命令部分

    • mysqldump:MySQL备份工具,需指定绝对路径(/usr/bin/),避免cron环境变量缺失导致命令找不到。
    • > /backup/db_$(date +\%Y\%m\%d).sql:将备份内容输出到以"日期"命名的文件(如db_20231001.sql),\%是转义符(cron中%需转义)。
    • 2>> /var/log/db_backup.log:将错误信息(标准错误流2)追加到日志文件,方便排查备份失败原因。
2. 每周日志清理
bash 复制代码
0 3 * * 0 /usr/bin/find ... 
  • 时间字段0 3 * * 0 表示"每周日凌晨3点"

    • 0:分钟(整点)
    • 3:小时(凌晨3点)
    • 0:周(0表示周日,1-6对应周一至周六)
  • 命令部分

    • find /var/log -name "*.log" -mtime +7 -delete:查找/var/log下7天前(-mtime +7)的.log文件并删除。
    • >> /var/log/log_cleanup.log 2>&1:将标准输出和错误(2>&1表示错误流重定向到标准输出)都追加到日志,记录清理情况。
3. 每月生成统计报告并发送邮件
bash 复制代码
0 10 1 * * /usr/local/bin/stat_report.sh ... 
  • 时间字段0 10 1 * * 表示"每月1日上午10点"

    • 1:日(每月1日)
  • 命令部分

    • stat_report.sh $(date -d 'last month' +\%Y) $(date -d 'last month' +\%m):执行自定义脚本,传入"上月年份"和"上月月份"作为参数(如10月1日传入2023和09)。
    • | mail -s "上月性能报告" admin@example.com:将脚本输出通过管道传给mail命令,发送邮件给管理员。
4. 每小时检查并重启服务
bash 复制代码
15 * * * * /usr/bin/systemctl is-active nginx || /usr/bin/systemctl restart nginx
  • 时间字段15 * * * * 表示"每小时的第15分钟"

    • 15:分钟(每小时15分)
    • *:小时(任意小时)
  • 命令部分

    • systemctl is-active nginx:检查Nginx状态,若运行中返回0(成功),否则返回非0。
    • ||:逻辑"或",若前半部分失败(服务停止),则执行后半部分systemctl restart nginx重启服务。
5. 工作日执行数据同步
bash 复制代码
0 17 * * 1-5 /data/scripts/sync_data.sh > /dev/null 2>&1
  • 时间字段0 17 * * 1-5 表示"每周一至周五下午5点"

    • 17:小时(下午5点)
    • 1-5:周(1=周一,5=周五)
  • 命令部分

    • sync_data.sh:自定义数据同步脚本。
    • > /dev/null 2>&1:将所有输出(标准输出和错误)丢弃(/dev/null是"黑洞"设备),适合无需记录的常规任务,避免cron发送冗余邮件。

注意事项

  1. 路径问题 :cron的环境变量精简,命令和脚本需用绝对路径(如/usr/bin/mysqldump而非mysqldump)。
  2. 权限问题 :执行的脚本需有可执行权限(chmod +x 脚本名),且cron用户(如root)需有操作目标文件/目录的权限。
  3. 时间格式 :周和日同时设置时,满足其一即执行(如0 0 1 1 0表示"1月1日"或"周日",若1月1日是周日则只执行一次)。
  4. 输出处理 :避免任务输出无意义信息,可通过> /dev/null 2>&1丢弃,或重定向到日志文件便于排查。

通过上述组合,可覆盖日常运维中备份、清理、监控、报告等大部分定时任务需求。

相关推荐
Qayrup24 分钟前
各个系统的 docker安装
运维·docker·容器
敲代码的瓦龙1 小时前
操作系统?进程!!!
linux·c++·操作系统
打不了嗝 ᥬ᭄2 小时前
数据链路层
linux·网络·网络协议·http
piaoxue8202 小时前
MFA MACOS 安装流程
linux·运维·服务器
柱子子子子3 小时前
Ubuntu24.04 不能使用todesk 解决办法
运维·服务器
天若有情6733 小时前
新闻通稿 | 软件产业迈入“智能重构”新纪元:自主进化、人机共生与责任挑战并存
服务器·前端·后端·重构·开发·资讯·新闻
BJ_Bonree3 小时前
圆桌论坛精华实录 | AI是重构运维逻辑的颠覆性革命?博睿数据与行业大咖亲授“AI+可观测性”的破局之道
运维·人工智能·重构
鱼干~3 小时前
electron基础
linux·javascript·electron
apocelipes3 小时前
POSIX兼容系统上read和write系统调用的行为总结
linux·c语言·c++·python·golang·linux编程
冬夜戏雪3 小时前
【尚庭公寓152-157】[第6天]【配置阿里云号码认证服务】
运维·服务器