当前位置: 首页 > news >正文

Linux定时任务cron完全指南:从写法到排错

定时任务谁都会用,但出问题的时候很多人抓瞎——任务没跑、跑了报错、跑了但没效果。

这篇把cron彻底讲清楚,包括怎么写、怎么调试、怎么排错。

crontab基础

编辑定时任务

# 编辑当前用户的crontabcrontab-e# 查看当前用户的crontabcrontab-l# 删除当前用户的所有crontab(危险)crontab-r# 编辑指定用户的crontab(需要root)crontab-u nginx -e

时间格式

分 时 日 月 周 命令 * * * * * command

五个时间字段:

  • 分:0-59
  • 时:0-23
  • 日:1-31
  • 月:1-12
  • 周:0-7(0和7都是周日)

常用写法

# 每分钟* * * * * /path/to/script.sh# 每小时的第30分钟30* * * * /path/to/script.sh# 每天凌晨2点02* * * /path/to/script.sh# 每天上午9点和下午6点09,18* * * /path/to/script.sh# 每隔5分钟*/5 * * * * /path/to/script.sh# 每隔2小时0*/2 * * * /path/to/script.sh# 工作日每天9点09* *1-5 /path/to/script.sh# 每月1号凌晨001* * /path/to/script.sh# 每周日凌晨3点03* *0/path/to/script.sh

特殊写法

@reboot /path/to/script.sh# 重启后执行一次@yearly /path/to/script.sh# 每年1月1日0点@monthly /path/to/script.sh# 每月1日0点@weekly /path/to/script.sh# 每周日0点@daily /path/to/script.sh# 每天0点@hourly /path/to/script.sh# 每小时0分

容易踩的坑

坑1:环境变量

这是最常见的问题。

cron执行任务时的环境变量和你在终端里不一样。PATH可能只有/usr/bin:/bin,很多命令找不到。

解决方法1:用绝对路径

# 错误02* * * python /home/user/script.py# 正确02* * * /usr/bin/python3 /home/user/script.py

解决方法2:在crontab开头定义环境变量

PATH=/usr/local/bin:/usr/bin:/binSHELL=/bin/bash02* * * python3 /home/user/script.py

解决方法3:在脚本开头source环境

#!/bin/bashsource/home/user/.bashrc# 后面的代码...

坑2:工作目录

cron执行时的工作目录是用户home目录,不是脚本所在目录。

# 脚本里用相对路径会出问题cd/home/user/project python script.py# 找不到# 正确做法:在脚本里cd#!/bin/bashcd/home/user/project||exitpython script.py

坑3:输出没处理

cron默认把输出发邮件。如果没配邮件,输出就丢了,出错也不知道。

# 把输出重定向到日志02* * * /path/to/script.sh>>/var/log/myjob.log2>&1# 如果不关心输出,丢到黑洞02* * * /path/to/script.sh>/dev/null2>&1

2>&1是把标准错误也重定向到标准输出,别漏了。

坑4:权限问题

# 脚本没有执行权限chmod+x /path/to/script.sh# 或者用解释器调用02* * * /bin/bash /path/to/script.sh

坑5:特殊字符

crontab里%有特殊含义(换行),要转义:

# 错误02* * *echo"$(date+%Y-%m-%d)">>/var/log/test.log# 正确02* * *echo"$(date+\%Y-\%m-\%d)">>/var/log/test.log# 或者放到脚本里,脚本里不用转义

调试方法

手动执行测试

先在命令行里把命令跑一遍,确认没问题。

/bin/bash /path/to/script.sh

模拟cron环境

cron的环境很干净,可以模拟:

env-i /bin/bash --noprofile --norc -c'/path/to/script.sh'

如果这样跑不通,说明脚本依赖了某些环境变量。

查看cron日志

# Debian/UbuntugrepCRON /var/log/syslog# CentOS/RHELgrepCRON /var/log/cron# 实时看tail-f /var/log/syslog|grepCRON

能看到任务有没有被触发:

Dec 27 02:00:01 server CRON[12345]: (user) CMD (/path/to/script.sh)

给任务加日志

02* * * /path/to/script.sh>>/var/log/myjob.log2>&1

脚本里也加一些输出:

#!/bin/bashecho"=====$(date)====="echo"开始执行..."# 业务逻辑echo"执行完成"

检查cron服务

# 看服务状态systemctl statuscron# Debian/Ubuntusystemctl status crond# CentOS/RHEL# 重启服务systemctl restartcron

系统级crontab

除了用户的crontab,还有系统级的。

# 系统crontab文件/etc/crontab# 系统cron目录/etc/cron.d/# 自定义任务/etc/cron.hourly/# 每小时执行/etc/cron.daily/# 每天执行/etc/cron.weekly/# 每周执行/etc/cron.monthly/# 每月执行

/etc/crontab格式多一个用户字段:

# 分 时 日 月 周 用户 命令02* * * root /path/to/script.sh

往/etc/cron.daily/里放脚本,每天会自动执行。脚本不需要crontab格式,就是普通shell脚本,但要有执行权限。

进阶用法

任务不要重叠执行

如果任务跑的时间长,可能上一次还没跑完,下一次又开始了。

用flock加锁:

* * * * * flock -n /tmp/myjob.lock /path/to/script.sh

-n表示非阻塞,拿不到锁就直接退出。

或者在脚本里自己实现:

#!/bin/bashLOCKFILE=/tmp/myjob.lockif[-f"$LOCKFILE"];thenecho"任务正在运行,退出"exit0fitrap"rm -f$LOCKFILE"EXITtouch"$LOCKFILE"# 业务逻辑

随机延迟

避免所有机器同时跑任务,压力集中:

02* * *sleep$((RANDOM \%300))&&/path/to/script.sh

随机睡0-300秒再执行。

超时控制

防止任务跑太久:

02* * *timeout3600/path/to/script.sh

超过1小时就kill掉。

通知执行结果

02* * * /path/to/script.sh||echo"任务失败"|mail -s"cron告警"admin@example.com

或者用钉钉/飞书webhook:

#!/bin/bash# script.sh# 业务逻辑result=$?if[$result-ne0];thencurl-s -X POST"https://oapi.dingtalk.com/robot/send?access_token=xxx"\-H"Content-Type: application/json"\-d'{"msgtype":"text","text":{"content":"定时任务执行失败"}}'fi

常用场景

日志轮转

00* * *find/var/log/myapp -name"*.log"-mtime +7 -delete

删除7天前的日志。

数据库备份

03* * * mysqldump -u root -pxxx mydb|gzip>/backup/mydb_$(date+\%Y\%m\%d).sql.gz

同步文件

0* * * *rsync-avz /data/ user@backup:/backup/data/

监控检查

*/5 * * * * /usr/local/bin/check_service.sh

清理临时文件

04* * *find/tmp -type f -atime +3 -delete

cron本身不复杂,坑主要在环境变量和错误处理上。

记住几个原则:

  1. 用绝对路径
  2. 重定向输出到日志
  3. 加锁防止重叠
  4. 失败要有通知

这样基本就不会出问题了。

http://www.zskr.cn/news/165103.html

相关文章:

  • 2025年净化门厂家推荐:江苏言信环境科技领衔,手术室/实验室/无尘室等十大高等级净化门品牌实力深度解析与选购指南 - 品牌企业推荐师(官方)
  • 2026年GEO优化源码搭建口碑推荐哪家好 - 源码云科技
  • 2025年洁净窗行业深度解析:江苏言信环境科技领衔,揭秘高等级气密洁净窗与模块化洁净窗的十大技术标杆与选购权威指南 - 品牌企业推荐师(官方)
  • S盒的代数免疫度
  • 2025年商业美陈设计公司推荐:东莞市共创广告有限公司,创意美陈与IP场景定制专家,商场节日美陈实力品牌深度解析 - 品牌企业推荐师(官方)
  • 2025年数码打印机厂家推荐:深圳易龙三维科技引领柔性印刷新浪潮,九大细分领域定制化解决方案权威解析 - 品牌企业推荐师(官方)
  • 2025年高温热油泵厂家权威推荐:河北兆宏机械泵业TAP/RYT/SRY系列节能型离心热油泵核心技术深度解析 - 品牌企业推荐师(官方)
  • openwrt路由器iptv设置
  • 2026年GEO优化源码搭建推荐排行哪家好 - 源码云科技
  • 【Week1_Day2】【软件测试学习记录与反思】【拆分知识点,形成思维导图,划分重点,优先级排序,集中80%精力攻克重点】
  • 为什么Transformer类模型特别适合TensorRT优化?
  • 2026年GEO优化源码搭建推荐榜单哪家好 - 源码云科技
  • TensorRT Builder优化策略选择指南
  • Excel如何在全校成绩册中,根据班级和总分求最高分、最低分呢?
  • 专业的企业信用服务排名
  • 【开题答辩全过程】以 基于大数据的健康评估管理系统的设计与实现为例,包含答辩的问题和答案
  • 【接口测试】3_PyMySQL模块 _连接数据库
  • 基于TensorRT镜像的大模型部署全流程指南
  • 深度探索.NET 中 IAsyncEnumerable:异步迭代的底层奥秘与高效实践
  • 2025年上海智慧招劳务派遣公司深度解析:劳务中介服务十大实力品牌排行,企业用工外包与灵活派遣权威指南 - 品牌企业推荐师(官方)
  • 2025最新!专科生必看8个AI论文工具测评,开题报告轻松搞定
  • 基于大数据的图书管理分析及可视化系统(毕设源码+文档)
  • 大模型Token成本太高?用TensorRT降低推理资源消耗
  • 云服务商为何偏爱TensorRT?背后的技术逻辑揭秘
  • Transformer 中为什么用LayerNorm而不用BatchNorm?
  • 告别高延迟:使用TensorRT优化大模型生成速度实战
  • Myvatis 动态查询及关联查询
  • Qt 构建错误及解决 error MSB4019: 找不到导入的项目 qt_defaults.props Visual Studio + Qt插件报错的解决办法
  • 2025年反应釜厂家推荐:江苏卓维装备有限公司领衔,不锈钢/碳钢/高压/实验室等八大品类实力品牌深度解析与选购指南 - 品牌企业推荐师(官方)
  • 性能瓶颈自动识别:长期运行服务的健康管家