Linux 定时任务
去年黑色星期五的时候买了一个 hostbrr 的储存盒子,实际就是一个空间比较大的提供了 ssh 权限的 directadmin 面板虚拟主机,放着一直吃灰。这几天在折腾其定时任务时发现,crontab 提供了一些我不知道的参数,呵呵。通过万能的搜索后,发现我对 Linux 定时任务认识根本不够,于是摘抄这篇文章。
crontab
crontab 是 Linux 系统中用于设置周期性执行任务的工具,允许用户根据自己的需求创建、修改和删除定时任务。它通过定义一系列的时间字段来精确控制任务的执行时间,并且可以执行任何有效的命令或脚本。
时间字段
crontab 的时间格式由五个部分组成,每个部分之间用空格分隔,具体如下:
- 分钟 (Minute):取值范围为0-59,表示每小时中的哪一分钟执行任务。
- 小时 (Hour):取值范围为0-23,表示每天的哪个小时执行任务。
- 日期 (Day of Month):取值范围为1-31,表示每月的具体某一天执行任务。
- 月份 (Month):取值范围为1-12 或使用英文缩写如jan, feb 等,表示每年的具体某个月执行任务。
- 星期 (Day of Week):取值范围为0-7(其中0 和7 都代表星期日),表示每周的具体某天执行任务。
特殊字符
为了更灵活地定义任务执行的时间规则,crontab 支持以下几种特殊字符:
- *:通配符,表示该字段的所有可能值。
- ,:枚举多个值,例如1,15 表示第 1 分钟和第 15 分钟。
- -:表示一个范围内的值,例如8-11 表示从第 8 分钟到第 11 分钟。
- /n:步长,例如*/5 表示每隔 5 分钟执行一次。
示例 crontab -e 编辑
- 每分钟执行一次命令:* * * * * /path/to/command
- 每天凌晨 2 点执行备份命令:0 2 * * * /path/to/backup.sh
- 每周一至周五上午 9 点发送邮件提醒:0 9 * * 1-5 /path/to/mail-reminder.sh
快速参考表
时间单位 | 取值范围 | 示例 |
---|---|---|
秒(可选) | 0 - 59 | */10 每 10 秒 |
分钟 | 0 - 59 | */5 每 5 分钟 |
小时 | 0 - 23 | 14 下午 2 点 |
日 | 1 - 31 | 1 每月的第一天 |
月 | 1 - 12 | 1 一月 |
星期 | 0 - 7 (0 和 7 都是周日) | 0 周日 |
此外,还有一些快捷方式可以帮助简化常见的调度模式:
- @yearly 或 @annually:每年 1 月 1 日午夜执行一次。
- @monthly:每月第一天午夜执行一次。
- @weekly:每周日凌晨执行一次。
- @daily 或 @midnight:每天午夜执行一次。
- @hourly:每小时开始时执行一次。
- @reboot:系统启动时执行一次。
at
与 crontab 不同,at 命令主要用于安排一次性任务,即只在指定的时间点执行一次的任务。一旦任务完成,就不会再重复执行。at 使用起来相对简单,适合于那些只需要执行一次的操作,比如发送一封邮件或运行一个临时性的脚本。
安装与启动服务
确保atd 服务已安装并正在运行。可以通过以下命令检查和启动服务:
systemctl status atd # 查看状态
systemctl start atd # 启动服务
如果尚未安装at,可以通过包管理器进行安装,例如在基于 Red Hat 的系统上使用yum:
yum install at -y
提交任务
要提交一个任务以在未来某个时间点执行,可以使用at 命令后跟时间参数。例如,要在今天下午 3 点执行一个命令,你可以这样做:
echo "command" | at 3pm today
对于更加复杂的任务,比如执行一个多行脚本,可以直接输入命令直到按Ctrl+D 结束输入:
at now + 1 hour
at> /path/to/script.sh
at>
这里now + 1 hour
表示从现在起一个小时后执行任务。
时间格式
at 支持多种时间格式,包括但不限于:
- HH:MM:当天的某个时刻。
- HH:MM YYYY-MM-DD:具体的年月日及时刻。
- HH:MM am/pm [Month] [Date]:支持 AM/PM 格式的日期。
- HH:MM + num [minutes | hours | days | weeks]:当前时间基础上增加一定的时间间隔。
例如,如果你想让任务在三天后的中午 12 点执行,可以这样写:
at noon + 3 days
管理任务
- 列出所有待执行的任务:
at -l
或者atq
。 - 删除特定编号的任务:
at -r job_number
或者atrm job_number
。
crontab 和 at 都是非常有用的命令行工具,它们各自适用于不同的场景。选择哪一个取决于你想要实现的任务性质——是需要定期重复执行的任务还是只需要执行一次的任务。掌握这两个工具的基础语法将大大提高你在 Linux 环境下的工作效率。