Linux 定时任务
黑色星期五的时候买了一个 hostbrr 的储存盒子,实际就是一个空间比较大的提供了 ssh 权限的 directadmin 面板虚拟主机,在折腾其定时任务时发现,crontab 提供了一些我不知道的参数,呵呵。于是对其搜索后发现,我对 Linux 定时任务认识不够,于是摘抄这篇文章,算是对Linux 定时任务 crontab这篇文章的补充。
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> <Ctrl+D>
这里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 环境下的工作效率。
本文编辑自:https://mp.weixin.qq.com/s/jiQUNOCFaAFqErNY8Sa3Aw...