at / cron - Linux定时任务计划

  • 原创
  • Madman
  • /
  • /
  • 0
  • 2640 次阅读

Linux定时任务计划-min.png

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命令只执行一次

分类: Linux
标签: anacron at batch cron crontab
未经允许不得转载: LIFE & SHARE - 王颜公子 » at / cron - Linux定时任务计划

分享

作者

作者头像

Madman

如需 Linux / Python 相关问题付费解答,请按如下方式联系我

0 条评论

暂时还没有评论.

专题系列


Logo - LIFE & SHARE - 王颜公子

Madman 2019. © All Rights Reserved.

粤ICP备18040049号

  • About
  • RSS
  • Sitemap

联系我