Linux如何设置定时任务

定时任务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 分钟执行一次
图片[1]-Linux如何设置定时任务-不念博客

单次定时计划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> <EOT>
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 [任务编号]
© 版权声明
THE END