首页 > 编程笔记 > Linux笔记 阅读:67

Linux at命令:一次性执行定时任务(非常详细)

在进行系统运行和维护时,有些工作可能不是马上就要执行的,而要在某个特定的时间执行一次或重复执行。为了不忘记这些工作,我们需要把它们记录在记事本中。如果计算机可以在指定的时间自动执行指定的任务,那么管理员不就轻松多了吗?

Linux 系统的定时任务(也可以叫作计划任务)就可以帮助管理员在指定的时间执行指定的工作。系统定时任务主要有两种执行方式:
下面详细介绍 at 命令的执行方式。

atd服务管理与访问控制

at 命令要想正确执行,需要 atd 服务的支持。atd 服务是独立的服务,其启动命令如下:
[root@localhost ~]# systemctl restart atd

如果想让 atd 服务开机时自启动,就可以使用如下命令:
[root@localhost ~]# systemctl enable atd

在 atd 服务启动之后,at 命令才可以正常使用,不过我们还要学习一下 at 命令的访问控制。这里的访问控制指的是允许哪些用户使用 at 命令设定定时任务,或者不允许哪些用户使用 at 命令。大家可以将其想象成设定黑名单或白名单,这样更容易理解。

at 命令的访问控制是依靠 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)这两个文件来实现的,具体规则如下:
系统中默认只有 /etc/at.deny 文件,而且这个文件是空的,这样系统中所有的用户都可以使用 at 命令。不过,如果我们打算控制用户的 at 命令使用权限,那么只需把用户写入 /etc/at.deny 文件即可。

对于 /etc/at.allow 和 /etc/at.deny 文件的优先级,我们做一个实验来验证一下,具体如下:
[root@localhost ~]# ll /etc/at*
-rw-r--r--. 1 root root 1 7 月 11 09:26 /etc/at.deny
# 系统中默认只有 /etc/at.deny 文件

[root@localhost ~]# echo user1 >> /etc/at.deny
[root@localhost ~]# cat /etc/at.deny
user1
# 把 user1 用户写入 /etc/at.deny 文件

[root@localhost ~]# su - user1
[user1@localhost ~]$ at 02:00
You do not have permission to use at.  <- 没有权限使用 at 命令
#切换成 user1 用户,这个用户已经不能使用 at 命令了

[user1@localhost ~]$ exit
logout
# 返回 root 身份

[root@localhost ~]# echo user1 >> /etc/at.allow
[root@localhost ~]# cat /etc/at.allow
user1
# 建立 /etc/at.allow 文件,并在文件中写入 user1 用户

[root@localhost ~]# su - user1
[user1@localhost ~]$ at 02:00
at>
# 切换成 user1 用户,user1 可以使用 at 命令。这时 user1 既在 /etc/at.deny 文件中
# 又在 /etc/at.allow 文件中,但是 /etc/at.allow 文件的优先级更高

[user1@localhost ~]$ exit
logout
# 返回 root 身份

[root@localhost ~]# at 02:00
at>
# root 用户虽然不在 /etc/at.allow 文件中,但是也能使用 at 命令
# 说明 root 用户不受这两个文件的控制
这个实验说明了 /etc/at.allow 文件的优先级更高,如果 /etc/at.allow 文件存在,那么 /etc/at.deny 文件会失效。/etc/at.allow 文件的管理更加严格,因为只有写入这个文件的用户才能使用 at 命令,如果需要禁用 at 命令的用户较多,就可以把少数用户写入这个文件。

/etc/at.deny 文件的管理较为松散,如果允许使用 at 命令的用户较多,就可以把禁用的用户写入这个文件。不过,这两个文件都不能对 root 用户生效。

Linux at命令

at 命令的格式非常简单,只需在 at 命令后面加入时间即可,这样 at 命令就会在指定的时间执行,其格式如下:
[root@localhost ~]# at [选项] 时间
选项:
时间格式:
at 命令只要指定正确的时间,就可以输入需要在指定时间执行的命令。这个命令可以是系统命令,也可以是 shell 脚本。

【实例 1】
[root@localhost ~]# cat /root/hello.sh
#!/bin/bash
echo "hello world!!"
# 该脚本会打印“hello world!!”

[root@localhost ~]# at now +2 minutes
at> /root/hello.sh >> /root/hello.log
# 执行 hello.sh 脚本,并把输出写入 /root/hello.log 文件
at> <EOT>    # 使用 Ctrl+D 快捷键保存 at 任务
job 1 at Thu Jul 11 09:46:00 2019    # 这是第一个 at 任务

[root@localhost ~]# at -c 1
# 查询第一个 at 任务的内容
...(省略部分内容)...
# 主要定义系统的环境变量
/root/hello.sh >> /root/hello.log
# 可以看到 at 执行的任务

【实例 2】
[root@localhost ~]# at 02:00 2019-07-12
at> /usr/bin/sync
at> /usr/sbin/shutdown -h now
at> <EOT>
job 2 at Fri Jul 12 02:00:00 2019
# 在指定的时间关机。在一个 at 任务中是可以执行多个系统命令的
在使用系统定时任务时,不论执行的是系统命令还是 shell 脚本,最好使用绝对路径来写命令,这样不容易报错。at 任务一旦使用 Ctrl+D 快捷键进行保存,实际上就写入了 /var/spool/at/ 目录,这个目录内的文件可以直接被 atd 服务调用和执行。

Linux at其他管理命令

at 还有查询和删除命令,具体如下:
[root@localhost ~]# atq
# 查询当前服务器上的 at 任务

例如:
[root@localhost ~]# atq
2    Fri Jul 12 02:00:00 2019 a root
# 说明 root 用户有一个 at 任务,工作号是 2

[root@localhost ~]# atrm [工作号]
# 删除指定的 at 任务

再例如:
[root@localhost ~]# atrm 2
[root@localhost ~]# atq
# 删除 2 号 at 任务,再查询 at 任务就不存在了

相关文章