at / cron - Linux定时任务计划
Synopsis: at通常用于执行一次性定时任务,batch命令会在CPU的工作负载小于0.8的时候,才执行设定的定时任务计划。crond用于周期性执行定时任务,使用crontab命令设置用户级别的定时任务,系统级的任务计划直接编辑/etc/crontab配置文件,注意多了一个用户名的字段,而且不能省略它。自己开发的程序要定时执行,建议在/etc/cron.d/目录下增加配置文件。如果系统在本来要执行定时任务的时间段内关机了,重新开机后,这些任务不会被执行,anacron可以解决这个问题,实现一定会定期内执行任务,把命令或脚本(不是按分钟、小时、日、月、周那样的任务格式哦)直接放到/etc/cron.daily等目录下即可(如果任务是非精确时间,也可以放在这些目录下),像CentOS预设的定时任务都放在/etc/cron.daily目录下
1. at
在类Unix 操作系统上,at
命令用于在当前系统时间后的某个时刻,仅执行某个命令一次
。更确切的说,at
命令从标准输入读取一系列命令,把它们收集成一个计划任务,在此后的某个时刻执行。这个任务仍使用当前的环境,并在与计划制定时相同的工作目录和环境变量里执行。所以,在指定计划任务时,建议使用绝对路径
来指明命令和文件!
CentOS系统使用守护进程atd
在后台定期检查任务列表(任务存放在/var/spool/at/
目录内),以在计划的时刻执行at
命令的任务;atq
命令列出当前队列里的任务(或者at -l
),atrm
命令从队列里删除任务(或者at -d
)。
1. 查看at命令 [root@CentOS ~]# type at at is /usr/bin/at [root@CentOS ~]# rpm -qf /usr/bin/at at-3.1.13-22.el7_4.2.x86_64 2. 管理atd守护进程 [root@CentOS ~]# systemctl status atd # 查看atd进程是否运行 ● atd.service - Job spooling tools Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2018-05-10 14:24:42 CST; 4 days ago Main PID: 699 (atd) CGroup: /system.slice/atd.service └─699 /usr/sbin/atd -f May 10 14:24:42 docker systemd[1]: Started Job spooling tools. May 10 14:24:42 docker systemd[1]: Starting Job spooling tools... [root@CentOS ~]# systemctl restart atd # 重启atd进程 [root@CentOS ~]# systemctl enable atd # 设置atd进程开机启动 [root@CentOS ~]# systemctl enable atd # 停止atd进程
1.1 权限控制
为了系统安全,不信任的用户不要允许他们使用at
命令,否则可能被黑客利用,定期使用at
命令在服务器上执行木马程序,然后上报给黑客。
可以利用/etc/at.allow
和/etc/at.deny
来进行权限控制:
/etc/at.allow
: 白名单,只有写入这个文件中的用户才能使用at
命令,每个用户一行/etc/at.deny
: 黑名单,如果用户被存在于这个文件中,则他不能使用at
命令
默认情况下,CentOS中的at
程序包会创建空的/etc/at.deny
,即如果你想禁止哪个用户使用at
命令,就把他的用户名写入此文件。如果以上两个文件均不存在,则只有root
用户可以使用at
命令。
1.2 创建一个单次执行的定时任务
使用at
命令关键在于设定时间的格式
:
1. 在今天的某时刻执行,如果此时刻已经过去了,则推迟到明天的这个时刻执行。格式为HH:MM[am|pm] [root@CentOS ~]# date Tue May 15 14:15:49 CST 2018 [root@CentOS ~]# at 20:15 at> /usr/bin/free -m at> <EOT> # 命令输入完后,按Ctrl + D结束输入,屏幕显示<EOT> job 6 at Tue May 15 20:15:00 2018 # 定时任务的编号为6 2. 指定某一天的某时刻执行。格式为HH:MM[am|pm] YYYY-MM-DD,或者HH:MM[am|pm] [Month] [Date] [root@CentOS ~]# at 08pm 2018-06-01 at> /usr/bin/who at> <EOT> job 7 at Fri Jun 1 20:00:00 2018 [root@CentOS ~]# at 06am July 10 at> /usr/bin/w at> <EOT> job 10 at Tue Jul 10 06:00:00 2018 3. 从某时刻之后推移多久时间后执行。格式为HH:MM[am|pm] + number [minutes|hours|days|weeks] [root@CentOS ~]# who root pts/0 2018-05-15 13:58 (172.17.1.80) [root@CentOS ~]# at now + 3 minutes at> /usr/bin/echo "Test at schedule tasks" > /dev/pts/0 # 打印到当前虚拟终端 at> <EOT> job 12 at Tue May 15 14:31:00 2018
设置好的定时任务可以在/var/spool/at/
目录中找到,at
命令每分钟检查一次此目录,如果当前时刻有符合条件的定时任务就执行它。
注意:
at
命令和下面要介绍的crontab
命令,它们的最小单位都是分钟
,每分钟检查一次,即整分(秒数为0的时候)
1.3 管理at任务
1. 查看at任务列表 [root@CentOS ~]# atq 6 Tue May 15 20:15:00 2018 a root 7 Fri Jun 1 20:00:00 2018 a root 或者: [root@CentOS ~]# at -l 2. 查看某任务的详情 [root@CentOS ~]# at -c 6 # 指定任务编号 3. 删除某任务 [root@CentOS ~]# atrm 6 # 指定任务编号
2. batch
当系统比较繁忙时,如果此时还要执行at
设定的定时任务的话,频繁的进程切换将导致系统的负载变得更高。此时,使用batch
命令将会是个更好的选择,batch
命令会在CPU的工作负载小于0.8
的时候(关注最近1分钟的平均工作负载
),才执行设定的定时任务计划。
batch
命令也是由at
程序包提供,只不过它加入一些控制参数来实现只CPU空闲时才执行定时任务:
[root@CentOS ~]# type batch batch is hashed (/usr/bin/batch) [root@CentOS ~]# rpm -qf /usr/bin/batch at-3.1.13-22.el7_4.2.x86_64
模拟系统高负载时,看看batch
命令何时执行定时任务:
1. 查看当前系统负载,显示很空闲 [root@CentOS ~]# uptime 15:01:33 up 5 days, 37 min, 1 user, load average: 0.00, 0.01, 0.05 2. 模拟高负载 [root@CentOS ~]# echo "scale=100000; 4*a(1)" | bc -lq & [1] 12741 [root@CentOS ~]# echo "scale=100000; 4*a(1)" | bc -lq & [2] 12743 [root@CentOS ~]# echo "scale=100000; 4*a(1)" | bc -lq & [3] 12745 [root@CentOS ~]# echo "scale=100000; 4*a(1)" | bc -lq & [4] 12747 [root@CentOS ~]# uptime 15:03:08 up 5 days, 38 min, 1 user, load average: 3.10, 1.01, 0.39 3. 设置定时任务,更新locate的查找索引数据库 [root@CentOS ~]# batch at> /usr/bin/updatedb at> <EOT> job 13 at Tue May 15 15:04:00 2018 4. 此时已经超过定时任务原来要执行的时刻15:04:00,但是却没执行at的任务 [root@CentOS ~]# date; atq Tue May 15 15:05:08 CST 2018 13 Tue May 15 15:04:00 2018 b root 5. 终止后台进程,让系统负载变低 [root@CentOS ~]# jobs [1] Running echo "scale=100000; 4*a(1)" | bc -lq & [2] Running echo "scale=100000; 4*a(1)" | bc -lq & [3]- Running echo "scale=100000; 4*a(1)" | bc -lq & [4]+ Running echo "scale=100000; 4*a(1)" | bc -lq & [root@CentOS ~]# kill -9 %1 %2 %3 %4 6. 当系统负载低于0.8后,at任务就自动执行完成 [root@CentOS ~]# uptime; atq 15:10:10 up 5 days, 45 min, 1 user, load average: 0.05, 0.92, 0.72
3. cron
相对于at
命令只执行一次
定时任务,周期性执行定时任务则由cron
(crond)这个系统服务来控制(比如每个小时、每天、每个星期一或每年的某一天执行)。cron
是类Unix 操作系统中,一个在后台运行的系统服务,它每分钟
扫描一次计划任务,并在发现任务时执行它们。
cron
在不同的Linux发行版上有不同的实现程序,CentOS中默认使用cronie
程序包,还有其它的实现版本,如fcron
、bcron
和dcron
等:
0 条评论
评论者的用户名
评论时间暂时还没有评论.