定时任务crond
Linux 可以定时执行指定的任务或程序,是一种常用工具。主要采用 crontab 命令:
crontab -e # 编辑 crontab 任务
crontab -l # 查询 crontab 任务
crontab -r # 删除当前用户所有的 crontab 任务
在 crond 编辑中,可以采用如下方式编辑定时任务:
* * * * * [command]
上述命令中:
- 第一个星号为分钟,取值为 0-59 这 60 个整数。
- 第二个星号为小时,取值为 0-23 这 24 个整数。
- 第三个星号为当月天数,取值为 1-31 这 31 个整数。
- 第四个星号为月份,取值为 1-12 这 12 个整数。
- 第五个星号为星期,取值为 0-6 这七个整数(0 为周日)。
以下是两个例子:
# 每天 01 点 05 分自动关机
05 01 * * * /sbin/shutdown -h now
# 每周日的 01 点 05 分自动重启
05 01 * * 0 /sbin/shutdown -r now
除使用星号代表所有值外,crontab 中还有以下符号:
- 逗号
,
可用于不连续时间。 - 横杠
-
用于表示时间范围。 - 斜杠
/
用于除以某个数,表示隔多久执行一次。
以下是几个示例:
* * * 12 * # 每年的 12 月每一天的每一分钟都执行一次
58 5 9 * * # 每个月的 9 号 5 点 58 分执行一次
0 1,8,15,23 * * * # 每天的 1, 8, 15, 23 点整各执行一次
0 1-14 * * * # 每天 1 点到 14 点一小时执行一次
*/15 * * * * # 每隔 15 分钟执行一次
单次定时计划at
与 crontab 的循环定时任务不同,at 命令用于制定一次性的定时任务。
如果系统没有 at 指令,则需要安装
sudo apt update && sudo apt install at
然后启动调度 atd 的守护进程:
sudo systemctl enable --now atd
在使用 at 命令时,切记要确保 atd 在后台已经启动,可采用以下命令查询:
ps -ef | grep atd
❝atd 会在每隔 60s 查询一次当前是否存在任务,若存在则执行一次,然后自动删除任务信息。❞
at 命令的使用规则如下:
at [options] [runtime]
其中指定时间的方式比较复杂,甚至还有很多模糊的时间指代方式。我个人认为常用的指定时间应是这几种格式:
# 指定当天具体的时间
at 16:00
# 指定某一天的具体时间
at 16:00 2023-09-21
# 指定多长时间后执行, 单位为 minutes, hours, days, weeks
at now + 50 minutes
at 16:00 2023-09-21 + 100 days
输入上述命令后,会进入 at 命令模式,在此输入需要执行的命令后回车,再用 Ctrl+D 完成输入并退出。例如:
$ at now + 10 minutes
warning: commands will be executed using /bin/sh
at> ls > /home/ubuntu/mount0/test.log
at>
job 5 at Thu Sep 21 17:46:00 2023
此时可以用 atq 命令来查询目前还未执行的任务。
atq
# 输出以下内容
5 Thu Sep 21 17:46:00 2023 a bunian
在上述输出中,5 代表任务编号,该编号每执行一次 at 就会增加一个。a 是队列字母。
如果想要放弃还未执行的任务,则需执行以下命令即可。
atrm [任务编号]