[toc]
定时任务是在服务器上常用到的一个工作。
在你指定的时间,系统会自动执行你指定的程序(脚本或者命令)。
Linxu系统中的定时任务不难,关键是如何写出正确的脚本。
在Linxu系统中,有三种用于任务调度的工具:
-
at
命令调用
atd
服务
-
crontab
命令调用
cron(crond)
服务。
-
anacron
工具。
只执行一次的定时任务需使用
at
命令。
at
命令是一次性执行的定时任务。也就是说我在之后什么时间点,执行一次任务。
1、at服务管理
at
命令要想正确执行,需要
atd
服务的支持。
atd
服务是独立的服务,所以启动的命令如下:
[root@localhost ~]# service atd start
提示:
只要你的Linux系统是安装的,哪怕是最小化安装,
at
命令和
cron
命令默认都是启动的。
我们发现大多数服务最后都有个
d
,这个
d
代表
Daemon
(守护进程)的意思。
# 查看Linux系统中的进程# 注意:第二行/usr/sbin/atd,才是atd服务。[root@localhost ~]# ps aux | grep atdrpcuser 1425 0.0 0.0 23352 1380 ? Ss 06:15 0:00 rpc.statdroot 1881 0.0 0.0 21108 496 ? Ss 06:15 0:00 /usr/sbin/atdroot 3332 0.0 0.0 103332 852 pts/2 S+ 09:29 0:00 grep atd
如果想要让
atd
服务开机时自动启动,可以设置如下命令:
[root@localhost ~]# chkconfig atd on
2、at命令的访问控制
atd
服务启动之后,
at
命令才可以正常使用,我们还要学习下
at
命令的访问控制。
这里的访问控制指的是允许哪些用户使用
at
命令设定定时任务,或者不允许哪些用户使用
at
命令。
大家可以想象成为设定黑名单或设定白名单,这样更容易理解。
at
的访问控制是依靠
/etc/at.allow
文件(白名单)和
/etc/at.deny
文件(黑名单)这两个文件来实现的。
注意:Linux系统中默认是没有
/etc/at.allow
文件的,用到的时候需要自己手动创建。
具体规则如下:
- 如果系统中有
/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.allow
文件存在,则
/etc/at.deny
文件失效。
/etc/at.allow
管理行为更加严格,因为只有写入这个文件的用户才能使用
at
命令,如果需要禁用
at
命令的用户较多,则可以把少数用户写入这个文件。
/etc/at.deny
文件的管理较为松散,如果允许使用
at
命令的用户较多,则可以把禁用的用户写入这个文件。不过这两个文件都不能对
root
用户生效。
3、at命令
格式如下:
[root@localhost ~]# at [选项] 时间选项:-m:当at命令工作完成后,无论是否命令有输出,都用email通知执行at命令的用户。-c工作号:显示该at工作的实际内容。时间:at支持的时间格式如下:HH:ММ 在指定的“小时:分钟”执行命令,例如:05:30。HH:MM YYYY-MM-DD 在指定的“小时:分钟 年-月-日”执行,例如05:30 2020-06-26。HH:MM[am|pm][month][date] 在指定的“小时:分钟[上午|下午][月][日]“执行,例如05:30 July 25。HH:MM[amlpm]+[minutes|hours|days|weeks] 在指定的时间“再加多久执行”,例now + 5 minutes,05am + 2 hours。
at
命令只要指定正确的时间,就可以输入需要在指定时间执行的命令了.这个命令可以是系统令,也可以是shell脚本。(也就是说确认命令的执行时间之后,按回车在输入你要执行的命令。)
示例:
# 1.编写一个shell脚本hello.sh[root@localhost ~]# cat /root/hello. sh#!/bin/bashecho "hello world!!!!"# 2.使用at命令在某个时间点执行该脚本[root@localhost ~]# at now + 2 minutes# 回车后,输入需要执行的命令# 把hello.sh脚本输入的内容,写入指定的文件中at> /root/hello.sh >> /root/hello.log# 使用ctrltd 保存at任务at> <EOT>job 1 at 2020-06-25 18:58# 会提示你,第1个at任务,会在2020年6月25日18:58分执行# 这个1代表工作号
查询指定的定时任务:
# 查询第1个at任务的内容# 可以看到at执行的任务内容[root@localhost ~]# at -c 1(工作号)# 可以看到有很多的内容# 前面主要是定义系统的环境变量# 最后面的/root/hello.sh >>/root/hel1o.1og
提示:
我们可以通过下面的
atq
命令查看到,Linux系统中
at
任务列表中,你所需要任务的工作号,然后在通过
at -c (工作号)
命令来查看一个
at
任务的具体内容。
在一个at任务中执行多个系统命令:
# 在指定的时间关机。[root@localhost ~]# at 02:00 2020-06-26at> /bin/syncat> /sbin/shutdown -h nowat> <EOT>job 1 at 2020-06-26 02:00
4、其他at管理命令
at
还有查询(
atq
)命令和删除(
atrm
)命令。
命令如下:
# 1.查询当前服务器上的at工作[root@localhost ~]# atq例如:# 说明:root用户有一个at在务在2020年6月25日的18:58执行,工作号是1[root@localhost ~]# atq1 2020-06-25 18:58 a root# 通过atq命令查看at定时任务,只能看到工作号,执行时间,哪个用户执行# 但是看不到具体执行的命令是什么,# 2.删除指定的at在务[root@localhost ~]# atrm [工作号]例如:# 删除1号at任务,然后通过atq命令查询就没有at任务存在了[root@localhost ~]# atrm 1
5、总结
at
命令平时用的并不多,因为
at
任务只能够执行一次任务。