Linux crontab 命令:定时任务调度与自动化运维入门
crontab (cron table) 是 Linux 系统自动化的基石。它由 cron 守护进程驱动,每分钟检查一次所有用户的任务表,判断是否有需要执行的任务。虽然现代系统中也有 systemd timer 等替代方案,但 crontab 因其简单、通用、跨发行版兼容,仍然是运维和开发中最常用的定时调度工具。
最基础的用法
crontab -e
首次执行会让你选择一个编辑器(通常选 nano 或 vim),进入后每行定义一个定时任务,格式如下:
* * * * * command_to_execute
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └── 星期 (0-7, 0和7都代表周日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日期 (1-31)
│ └──────── 小时 (0-23)
└────────── 分钟 (0-59)
实际使用中,高频场景与命令组合
1. 常见时间表达式示例
- 每分钟执行一次:
* * * * * /scripts/check_health.sh - 每天凌晨 2:30 执行:
30 2 * * * /scripts/backup.sh - 每周一上午 9:00 执行:
0 9 * * 1 /scripts/weekly_report.sh - 每月 1 号零点执行:
0 0 1 * * /scripts/monthly_cleanup.sh - 每 15 分钟执行一次:
*/15 * * * * /scripts/monitor.sh - 工作日(周一至周五)每小时执行:
0 * * * 1-5 /scripts/workday_task.sh
2. 管理定时任务
- 列出当前用户的所有任务:
crontab -l - 删除当前用户的所有任务(慎用):
crontab -r - 查看其他用户的任务(需 root):
crontab -u username -l
3. 输出重定向与日志记录
crontab 默认不会显示命令输出,如果脚本有 stdout/stderr,建议显式重定向到日志文件:
30 2 * * * /scripts/backup.sh >> /var/log/backup.log 2>&1
>> 追加写入日志,2>&1 将标准错误也重定向到同一文件,方便排查问题。
4. 环境变量问题
crontab 的执行环境与交互式 Shell 不同,不会加载 .bashrc 或 .bash_profile,因此很多变量(如 PATH)可能缺失。最佳实践是在脚本开头显式声明,或在 crontab 顶部定义:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
30 2 * * * /scripts/backup.sh
或者在脚本内部使用绝对路径调用命令(如 /usr/bin/python3 而非 python3)。
5. 特殊时间关键字
crontab 支持一些简写关键字,便于记忆:
| 关键字 | 等价表达式 | 含义 |
|---|---|---|
@reboot |
— | 系统启动时执行一次 |
@yearly |
0 0 1 1 * |
每年 |
@monthly |
0 0 1 * * |
每月 |
@weekly |
0 0 * * 0 |
每周 |
@daily |
0 0 * * * |
每天 |
@hourly |
0 * * * * |
每小时 |
例如:
@reboot /scripts/startup.sh
@daily /scripts/cleanup.sh
6. 防止任务重叠执行
如果任务执行时间可能超过调度间隔(比如每 5 分钟跑一次,但脚本有时要跑 8 分钟),需要用锁机制避免并发:
*/5 * * * * flock -n /tmp/mytask.lock /scripts/task.sh
flock 会尝试获取文件锁,如果上一个实例还在运行(锁未释放),新实例直接跳过。
如果不知道如何下手,可以先尝试
crontab -e
添加一行测试任务:
* * * * * echo "$(date)" >> /tmp/cron_test.log
等待 1-2 分钟后检查:
cat /tmp/cron_test.log
如果能看到时间戳输出,说明 crontab 工作正常。确认无误后记得删除这条测试任务。
或者,如果你发现某个定时任务没有按预期执行,排查步骤通常是:
crontab -l # 1. 确认任务确实配置了
grep CRON /var/log/syslog # 2. 查看 cron 守护进程是否触发了(Ubuntu/Debian)
cat /var/log/cron # 3. 查看 cron 日志(CentOS/RHEL)
- 点赞
- 收藏
- 关注作者
评论(0)