Linux系统的工作任务有两种工作排程方式:

  1.一种是未来某个特定的时间点的,该任务执行完后则不再执行。例如在下周某一天几点钟提醒该出门办理签证。

  2.一种是例行性的,就是按照设定的某种模式有规律的周期性执行。例如每周日凌晨4点钟进行数据库的备份工作;系统每隔半小时检查系统内存使用情况等。

 那么在Linux系统中是如何达到这两个功能的呢?简单的讲,上面两种情况可分别使用at指令与cron系统服务来实现。

  一、 at方式的例行性工作安排

  1.启动atd服务

  在linux系统上统一负责未来某个时间点的一次性工作任务的服务就是atd,它在CentOS系统上是默认是打开的。我们只需根据需要配置在某个时间点要执行的工作指令或任务,在时间点到来时atd会自动执行相关任务。atd服务的相关操作如下:

    #查看系统默认atd服务的状态    
    [root@dell ~]# chkconfig --list atd
    atd   0:off1:off2:off3:on4:on5:on6:off
    #打开该服务方法如下
    [root@htkc ~]# /etc/init.d/atd start
    #检查当前状态:
    [root@htkc ~]# /etc/init.d/atd status
    atd (pid  2241) is running...
    #显示系统正在运行中。


  2.at的工作

  at指令有两种工作方式,一种是交互方式,就是用户在at>提示符后输入多个要执行的执行命令,在输入完成后用ctrl+d提交任务。另一种则是将要执行的任务的各指令写入文件中并由at进行调用。  

    #执行at命令,指定在某个时间点输出内容到/tmp/test.at文件
    [root@htkc ~]# at 23:05
    at> echo "now is:`date '+%F %R'`" >/tmp/test.at
    at> cat /etc/fstab >> /tmp/test.at
    at> <EOT>
    job 7 at 2016-06-17 23:05
    #查询当前at的所有工作排程
    [root@htkc ~]# atq
    72016-06-17 23:05 a root


  其实,在执行完at指令后,系统会根据用户输入的指令内容自动的生成一文件,并保存在/var/spool/at目录中。如下指令所示:

    [root@htkc ~]# ll /var/spool/at    
    总用量 8
    -rwx------. 1 root   root   2918 6月  17 22:58 a000070174de29
    drwx------. 2 daemon daemon 4096 6月  17 22:40 spool
    
    #显示系统自动生成的at文件
    [root@htkc ~]# cat /var/spool/at/a000070174de29 
    #!/bin/sh
    # atrun uid=0 gid=0
    # mail root 0
    #…….中间删除部分内容
    echo "now is:`date '+%F %R'`" >/tmp/test.at
    cat /etc/fstab >> /tmp/test.at
    marcinDELIMITER6be5911e
    # cat /var/spool/at/a000070174de29文件内容结束 
    
    #at任务完成后,打开文件,显示执行时间与设定时间一致
    [root@htkc ~]# cat /tmp/test.at
    now is:2016-06-17 23:05
    #
    # /etc/fstab
    # Created by anaconda on Mon Jun 13 20:04:39 2016
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    UUID=b770379b-7394-4d18-bb60-31b6bdea2af9 /    ext4    defaults        1 1
    #………中间删除一部分内容
    proc     /proc      proc    defaults        0 0


  上面是采用命令的交互方式,另一种方式则是将要执行的各指令写入文件中并由at进行调用。如下:

    #编辑文件testat.sh,在文件中输入两指令     
    [root@htkc tmp]# vim /tmp/testat.sh
    echo "now is:`date '+%F %T'`" > /tmp/test2.at
    cat /etc/fstab >> /tmp/test2.at
    #由at指令在某一时间点调用执行。
    [root@htkc ~]# at -f /tmp/testat.sh 23:37


  两种指令执行方式虽不同,但过程和效果是一样。


  3.at的常用语法

  at TIME 设置工作排序

  Time可以具体的日期或时间了,如YYYY-MM-DD或例子中的HH:MM,也可以是模糊时间,now, noon, midnight, teatime, tomorrow等。


  at –l 或atq :查看工作排程列表 


  at -d job_num或 atrm job_num : 删除工作排程,后接任务编号