Linux at命令:一次性执行定时任务(非常详细)
在进行系统运行和维护时,有些工作可能不是马上就要执行的,而要在某个特定的时间执行一次或重复执行。为了不忘记这些工作,我们需要把它们记录在记事本中。如果计算机可以在指定的时间自动执行指定的任务,那么管理员不就轻松多了吗?
Linux 系统的定时任务(也可以叫作计划任务)就可以帮助管理员在指定的时间执行指定的工作。系统定时任务主要有两种执行方式:
下面详细介绍 at 命令的执行方式。
如果想让 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 文件的优先级,我们做一个实验来验证一下,具体如下:
/etc/at.deny 文件的管理较为松散,如果允许使用 at 命令的用户较多,就可以把禁用的用户写入这个文件。不过,这两个文件都不能对 root 用户生效。
时间格式:
at 命令只要指定正确的时间,就可以输入需要在指定时间执行的命令。这个命令可以是系统命令,也可以是 shell 脚本。
【实例 1】
【实例 2】
例如:
再例如:
Linux 系统的定时任务(也可以叫作计划任务)就可以帮助管理员在指定的时间执行指定的工作。系统定时任务主要有两种执行方式:
- 第一种是使用 at 命令,at 命令定义的系统定时任务只能在指定时间执行一次,而不能循环执行;
- 第二种是使用 crontab 命令,这个命令设定的系统定时任务比较灵活,可以按照分钟、小时、天、月或星期几循环执行任务。
下面详细介绍 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.allow 文件,那么只有写入 /etc/at.allow 文件中的用户可以使用 at 命令,其他用户不能使用 at 命令(/etc/at.deny 文件会被忽略,也就是说,如果同一个用户既写入 /etc/at.allow 文件,又写入 /etc/at.deny 文件,那么这个用户是可以使用 at 命令的,因为 /etc/at.allow 文件的优先级更高)。
- 如果系统中没有 /etc/at.allow 文件,只有 /etc/at.deny 文件,那么写入 /etc/at.deny 文件中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效。
- 如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令。
系统中默认只有 /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 [选项] 时间选项:
- -m:当 at 工作完成后,无论命令是否有输出,都用 E-mail 通知执行 at 命令的用户;
- -c 工作号:显示该 at 工作的实际内容。
时间格式:
- HH:MM:在指定的“小时:分钟”执行命令,如 02:30;
- HH:MM YYYY-MM-DD:在指定的“小时:分钟 年-月-日”执行命令,如 02:30 2013-07-25;
- HH:MM[am|pm] [month] [date]:在指定的“小时:分钟[上午|下午][月][日]”执行命令,如 02:30 July 25;
- HH:MM[am|pm]+[minutes|hours|days|weeks]:在指定的时间“再加多久”执行命令,如 now+5 minutes,05am+2 hours;
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 任务就不存在了