在计算机的使用过程中,经常会有一些计划中的任务需要在将来的某个时间执行,Linux 中提供了一些方法来设定定时任务
:
- at;
- crontab;
- systemd.timer。
这篇文章我们先来介绍 at
的使用方法。
at 简介
命令 at
从文件或标准输入中读取命令并在将来的一个时间执行,只执行一次。at
的正常执行需要有守护进程 atd
。
at 命令格式:at [参数] [时间]
at 命令参数:
- -m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
- -I atq的别名
- -d atrm的别名
- -v 显示任务将被执行的时间
- -c 打印任务的内容到标准输出
- -V 显示版本信息
- -q<列队> 使用指定的列队
- -f<文件> 从指定文件读入任务而不是从标准输入读入
- -t<时间参数> 以时间参数的形式提交要运行的任务
at 安装
#安装at
[root@peipei3514 ~]# yum install -y at
#启动守护进程
[root@peipei3514 ~]# systemctl start atd
#查看是否开机启动
[root@peipei3514 ~]# systemctl list-unit-files|grep atd
#设置开机启动
[root@peipei3514 ~]# systemctl enable atd
at 使用
如果不使用管道|或指定选项 -f
的话,at
的执行将会是交互式的,需要在 at
的提示符下输入命令:
#创建定时任务
[root@peipei3514 /]# at now +2 minutes #执行at并指定执行时刻为现在时间的后两分钟
at> echo hello world > /tmp/file #手动输入命令并回车
at> <EOT> #ctrl+d 结束输入
job 3 at Wed May 2 18:20:00 2018 #显示任务号及执行时间
选项 -l
或命令 atq
查询任务:
[root@peipei3514 /]# atq
3 Wed May 2 18:20:00 2018 a root
到达时间后任务被执行,生成一个新文件file并保存echo的输出内容:
[root@peipei3514 /]# ll tmp/
总用量 4
-rw-r--r--. 1 root root 12 5月 2 18:20 file
drwx------. 3 root root 17 5月 2 16:56 systemd-private-9b1eddd804d24223a769ba0be3fc7736-chronyd.service-hAmDBg
drwx------. 2 root root 6 5月 2 16:56 tmp.6EvK3t6xmq
drwx------. 2 root root 6 4月 23 18:41 tmp.HEQ599GHwD
drwx------. 2 root root 6 5月 2 12:44 tmp.VqttdTFfak
drwx------. 2 root root 6 4月 23 18:41 tmp.WDevelDATu
[root@peipei3514 /]# cat /tmp/file
hello world
选项 -d
或命令 atrm
表示删除任务:
[root@peipei3514 /]# at -d 3 #删除3号任务(上例)
[root@peipei3514 /]# atq
[root@peipei3514 /]#
可以使用管道 |
或选项 -f
让 at 从标准输入或文件中获得任务:
[root@peipei3514 /]# cat test.txt
echo hello world > /root/temp/file
[root@peipei3514 /]# at -f test.txt 5pm +2 days
job 12 at Wed May 4 18:20:00 2018
[root@peipei3514 /]# cat test.txt|at 16:20 12/23/18
job 13 at Fri Dec 23 16:20:00 2018
at 时间格式
at
指定时间的方法很丰富,可以是:
- hh:mm 小时:分钟(当天,如果时间已过,则在第二天执行);
- midnight(深夜),noon(中午),teatime(下午茶时间,下午4点),today,tomorrow等;
- 12小时计时制,时间后加am(上午)或pm(下午);
- 指定具体执行日期:mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年);
- 相对计时法:now + n units,now是现在时刻,n为数字,units是单位(minutes、hours、days、weeks)。
如明天下午2点20分执行创建一个目录:
[root@peipei3514 /]# at 02:20pm tomorrow
at> mkdir /root/temp/X
at> <EOT>
job 4 at Wed May 2 18:25:00 2018
at 控制文件
atd
通过两个文件 /etc/at.allow
和 /etc/at.deny
来决定系统中哪些用户可以使用 at 设置定时任务,它首先检查 /etc/at.allow
,如果文件存在,则只有文件中列出的用户(每行一个用户名),才能使用 at;如果不存在,则检查文件 /etc/at.deny
,不在此文件中的所有用户都可以使用 at。如果 /etc/at.deny
是空文件,则表示系统中所有用户都可以使用 at;如果 /etc/at.deny
文件也不存在,则只有超级用户(root)才能使用at。
at 例子
实例1:三天后的下午 5 点钟执行 /bin/ls
命令:
at 5pm+3 days
输出:
[root@localhost ~]# at 5pm+3 days
at> /bin/ls
at> <EOT>
job 7 at 2013-01-08 17:00
[root@localhost ~]#
实例2:明天17点钟,输出时间到指定文件内
命令:
at 17:20 tomorrow
输出:
[root@localhost ~]# at 17:20 tomorrow
at> date >/root/2013.log
at> <EOT>
job 8 at 2013-01-06 17:20
[root@localhost ~]#
实例3:计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务
命令:
atq
输出:
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
7 2013-01-08 17:00 a root
[root@localhost ~]#
实例4:删除已经设置的任务
命令:
atrm 7
输出:
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
7 2013-01-08 17:00 a root
[root@localhost ~]# atrm 7
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
[root@localhost ~]#
实例5:显示已经设置的任务内容
命令:
at -c 8
输出:
[root@localhost ~]# at -c 8
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22此处省略n个字符
date >/root/2013.log
[root@localhost ~]#