使用at命令设定一次性定时任务

说明

Linux的crontab已经被广泛使用。crontab比较适合多次、周期性执行的定时任务。而at更适合一次执行的定时任务。

安装

一般Linux发行版中默认已经安装并启用at。如果没有,则需要手工安装。

安装:

[root@test01 ~]# yum install at -y

at安装后,会在OS生成一个叫atd的服务。可以通过systemctl或service命令和chkconfig命令对此服务进行管理:

service atd <status|stop|restart|status>
chkconfig --list atd
chkconfig atd <|on|off>

[root@test01 ~]# systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

使用

添加定时任务

语法:

# at [参数] [时间]

常见参数:

-m :当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
-I :atq的别名
-d :atrm的别名
-v :显示任务将被执行的时间
-c :打印任务的内容到标准输出
-V :显示版本信息
-q :后面加<列队> 使用指定的列队
-f :后面加<文件> 从指定文件读入任务而不是从标准输入读入
-t :后面<时间参数> 以时间参数的形式提交要运行的任务at> 执行的指令
退出at命令 ctrl+d。

举个例子,设定11:00自动echo date> /tmp/currDateTime.txt`:

[root@test01 ~]# at 23:00
at> echo `date +%F` >/tmp/1.txt
at> <EOT>
job 2 at Fri Apr 23 23:00:00 2021

时间的几种表示法:

如果at时间小于当前时间,为第二天的时间执行
07:00
07:00am
07:00pm
07:00AM
07:00PM
23:15 2016-06-24
11:30 + 2hours
11:30 + 2 hours
07:30am + 3weeks
07:30am + 3days
07:30am + 3minutes

查询定时任务

[root@test01 ~]# at -l  #等于atq
1    Fri Apr 23 23:00:00 2021 a root
2    Fri Apr 23 23:00:00 2021 a root
[root@test01 ~]# atq
1    Fri Apr 23 23:00:00 2021 a root
2    Fri Apr 23 23:00:00 2021 a root

# 输入at -c(Job ID)查询具体任务内容
[root@test01 ~]# at -c 1
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
...省略
...省略
${SHELL:-/bin/sh} << 'marcinDELIMITER349ed1a1'
#以下为上面创建at任务的具体命令
echo `date +%F` >/tmp/1.txt

marcinDELIMITER349ed1a1

删除定时任务

at -d 2(Job ID)
atrm 2

使用权限控制

at通过/etc/at.allow/etc/at.deny两个文件来控制各个OS用户是否具有使用at的权限。规则如下:

  1. /etc/at.allow文件存在时:只有文件中列出的OS用户有使用权限。
  2. /etc/at.allow文件不存在时。则看/etc/at.deny文件是否存在。如果存在,则/etc/at.deny中列出的用户没有权限,其他用户有权限。
  3. 如果/etc/at.allow/etc/at.deny两个文件都不存在,则只有root用户有使用权限。
  4. 一般Linux中,默认没有/etc/at.allow文件,有一个空的/etc/at.deny文件,表示默认所有用户都有权限使用at功能。
文章目录