在 Linux 中循环执行命令或任务常用 crontab 开进行,定时执行一次命令或任务常用 at 命令进行。

安装 at

Debian or Ubuntu

1
2
sudo apt update
sudo apt install at

CentOS or redhat

1
sudo yum install at

at 的守护进程是 atd,使用 at 命令时一定要保证守护进程开启。

1
2
3
4
5
6
# 开启守护进程
sudo systemctl start atd.service
# 开机自启守护进程
sudo systemctl enable atd.service
# 查看守护进程是否运行
sudo systemctl status atd.service

at 定时任务

at 定时任务的设置一般格式如下:

1
at [option] runtime

添加定时命令方法一

在上午10:00执行任务:

1
2
3
4
5
6
7
at 10:00
warning: commands will be executed using /bin/sh
# 添加需要定时执行的命令
at> date > hello.txt
# 使用快捷键: Ctrl + D 退出
at> <EOT>
job 1 at Mon Jan 2 10:00:00 2023

添加定时命令方法二

直接使用 echo 命令添加定时任务

1
2
# 10:00 执行重启电脑任务
echo "shutdown -r now" | at 10:00

添加定时任务方法三

有时候我们需要执行的任务是一个脚本文件,可以使用如下命令执行

1
at 10:00 -f /home/jinzhongxu/hello.sh

默认情况下,at 命令执行完后如果有输出结果会向用户发送邮件,可以使用如下方法抑制邮件发送:

1
at 10:00 -M

如果没有输出结果也想向用户发送邮件:

1
at 10:00 -m

时间

at 命令除了运行的命令和任务外,最重要的是时间,我们可以使用如下方法指定时间

time

时间格式有:HH:MMHHMM,如果是12小时制,可以使用 pmam 表示下午或上午。也可以使用时间单词,如:now, midnight, noon, teatime(表示16:00)。如果指定的时间超过当前时间,则会推迟1天执行。

date

也可以指导执行的天,如 today, tomorrowMMDD[CC]YY, MM/DD/[CC]YY, DD.MM.[CC]YY[CC]YY-MM-DD.

Increment

增量时间,如: now + count time-unit,这里 count 表示数字,time-unit 表示数字时间单位,如 minutes, hours, days, or weeks.

1
2
# 在周日,比当前时间多10分钟执行命令
at sunday +10 minutes
1
2
# 2天后的下午1点
at 1pm + 2 days
1
2
# 1小时后执行
at now +1 hours
1
2
3
# 在23年1月21日12:30执行
at 12:30 210123
at 12:30 21.01.2023

可以使用 -t 指定具体时刻,格式: [[CC]YY]MMDDhhmm[.ss]

1
2
# 在23年1月1日12:30:32执行
at -t 202301011230.32

指定队列

默认情况下,所有的 at 命令或任务在 a 队列,可以使用 -q 指定不同的队列,队列名编号可为 a-zA-Z

1
2
# 星期一比现在多2小时执行任务,添加到队列 L 中
at monday +2 hours -q L

查看任务队列

1
2
3
4
5
6
7
8
atq
# 或者
at -l

1 Mon Jan 2 10:00:00 2023 a jinzhongxu

# 查看序号 1 的任务详细信息
at -c 1

前面的序号为任务序号,依次累计

取消队列任务

取消序号为 1 的任务

1
2
3
atrm 1
# 或者
at -r 1

限制用户

配置文件 /etc/at.deny/etc/at.allow 分别表示限制用户使用 at 命令和允许某些用户使用 at 命令。
默认情况下,只存在配置文件 /etc/at.deny 且为空,表示所有用户可以使用 at 命令,如果不想某个用户使用,可以将用户名添加到该文件。
如果配置文件 /etc/at.allow 存在,则只有该文件中的用户可以使用命令。
如果两个配置文件都不存在,则只有具有管理员权限的用户可以使用。

参考文献

  1. At Command in Linux