linux任务计划

0.目录

1.单一任务调度at

在将来某特定时间执行操作,可使用at命令。
使用格式:at [options] TIME,而后即可在交互界面输入可执行的操作,“ctrl + d”结束操作。
执行结果会发送至用户邮箱/var/spool/mail/USERNAME


TIME的表示

  • 精确时间
    精确写明执行时间。年月日可使用“-”“.”或“/”进行间隔,也可不使用间隔。

    [root@local ~]# at 22:30 2017-2-22
    at> ls /                     # 到指定时间执行列出根目录各文件的操作
    at> <EOT>

    精确时间也可仅几时几分,表示下一个该时分执行操作。

  • 相对时间
    now+时间段”表示相对现在经过的时间,时间段单位有miniutes(可简写为min)、hours、days、weeks等。

    [root@local ~]# at now+1min          # 1分钟后执行操作
    at> ls /
    at> <EOT>
  • 模糊时间
    使用日常用语表达时间,其实并不模糊。比如midnight表示0点,noon表示正午12点等。

at的常用选项

  • 选项“-l”,列出当前已提交过的任务(相当于命令atq)。

    [root@local ~]# at -l
    3   2017-02-22 22:30 a root
    • 第1字段为任务编号1
    • 第2字段为任务执行时间;
    • 第3字段为队列号2
    • 第4字段为设置任务的用户。
  • 选项“-f”,读取文件中的指令作为任务的操作。
    对于需频繁执行的操作,可事先写在文件中3,这样就不用频繁与at交互写入指令了。

    [root@local ~]# cat <<EOF > test_file
    ls /
    ls /tmp
    EOF
    
    [root@local ~]# at -f test_file now+1min
    job 6 at 2017-02-21 20:44
  • 选项“-d”,撤销指定任务,参数为任务编号(相当于命令atrm)。

    [root@local ~]# at -l
    3   2017-02-22 22:30 a root
    [root@local ~]# at -d 3
    [root@local ~]# at -l
    [root@local ~]#
  • 选项“-c”,查看指定任务的内容及定义任务时的环境,参数为任务编号。
    对于长时间后才执行的任务,为便于中途查看其内容,可使用此选项,且会列出定义该任务时的shell环境4
    环境变量过多,此处不再列出此选项的执行结果。
  • 选项“-q”,指定任务所属队列。

    [root@local ~]# at -q b now+1min
    at> echo hello    
    at> <EOT>
    job 9 at 2017-02-21 21:11
    
    [root@local ~]# at -l
    9   2017-02-21 21:11 b root

2.周期性任务计划cron

对于需周期性执行的操作,比如数据备份等,可使用周期性任务计划。

周期性任务执行结果,也会发送至用户邮箱/var/spool/mail/USERNAME5

2.1 所需服务

周期性任务计划,需要名为crond的服务(如没有需安装对应软件包)时刻监控是否有任务需执行。所以要确保该服务处于运行状态,否则定义的周期性任务计划不会执行。

[root@local ~]# service crond status
crond (pid  2009) is running...

2.2 系统cron

周期性任务计划(cron任务)分为两类:系统cron、用户cron。
二者的任务都需定义在配置文件中,且配置文件有固定格式

系统cron主要用于系统自身的维护,配置文件为/etc/crond,如修改则需直接编辑,不过一般无需用户修改。

[root@local ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

可以看到系统cron的配置文件,开头也定义了环境变量PATH,但明显少于常用路径。故定义是也需使用命令绝对路径或在执行的脚本中重新定义PATH。

2.3 用户cron

2.3.1 用户cron配置文件

用户cron的配置文件为/var/spool/cron/USERNAME

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  *  command to be executed

文件格式与系统cron的配置文件相同,不过不用在定义时间后指明运行任务的user-name,因为定义者肯定是当前用户;也不用定义MAILTO,因为运行结果是发给定义任务的用户的。

每行定义一个周期任务,定义格式就是* * * * * command to be executed
其中“*的位置用来定义周期性时间,共5字段,后跟需执行的操作6

2.3.2 周期性时间表示

表示周期性时间的5个字段的意义依次为:分钟、小时、日、月、星期。最小单位是分钟,如想实现以秒计的时间周期,则只能通过执行的脚本的内容实现。

如果到了指定时间,由于关机等原因而导致任务没有按时执行的,不会补偿执行,只能等到下个周期时间再执行。

周期性时间有多种取值方式,以满足不同场景:

  • 特定取值
    在指定时间位置,写明具体数字。无需指定的,可使用“*”号,表示“每……”。

    比如每小时的第3分钟执行操作:
    3 * * * * COMMAND
    每年5月25日20点10分执行操作7
    10 20 25 5 * COMMAND

  • 离散取值
    多个特定取值,各特定值使用逗号隔开。

    比如每周三和周五,这两天的8点整和20点整,执行操作:
    0 8,20 * * 3,5 COMMAND

  • 连续取值
    用于表示连续时间,使用“-”号。

    比如周一至周五,每天的9点至18点,期间的每个整点执行操作:
    0 9-18 * * 1-5 COMMAND

  • 定义步长
    时间步长默认为1,若需改变指定位置的时间步长,使用“/”号。

    比如周一至周五,每天的9点至18点,期间每2分钟执行操作:
    */2 9-18 * * 1-5 COMMAND

    注意,如果表示每7分钟执行操作,并不能简单地把上述的2改为7。因为60无法被7整除,56分钟后,再过4分钟又会重新开始执行,无法达到预期效果。类似功能只能通过执行的脚本内容的设定实现。

2.3.3 命令crontab

命令crontab用于管理用户cron。
常用选项:

  • 选项“-e”,用于编辑用户cron配置文件。
    实际就是调用了vi编辑用户配置文件/var/spool/cron/USERNAME。但不要直接使用编辑器编辑该文件,只有使用cron命令进行编辑时,系统会检查语法、格式是否错误
    对于需删除的周期任务,直接删除、或注释掉配置文件中对应的行即可
    配置文件/var/spool/cron/USERNAME编辑完成后,立即生效
  • 选项“-l”,列出当前用户的所有周期性任务。
    比如添加一个整点报时的任务,再由此选项查看:

    [root@local ~]# crontab -l
    0 * * * * echo "It's $(date +\%F\%t\%T)"   

    如上所示,cron配置文件中命令部分的“%”需要转义,否则将作为换行符,且第一个换行符后的内容将被作为标准输入的内容传递给命令。

  • 选项“-r”,移除当前任务所有周期性任务。
    实际是把当前用户对应的cron配置文件都删除了。

  • 选项“-u”,管理指定用户的cron配置文件。
    与上述的“-e”连用为编辑;“-l”连用为列出等等。
    显然只有root有此权限。

(完)


  1. 此处为3是因为此前已经设置过2个任务了,任务1、2执行完毕或被撤销后就不存在了。但任务编号采用的是绝对编号,1、2不存在了,任务3也仍然是3,且随后创建的任务会依次排序,也不会是1、2。
  2. 这里的队列是为了便于管理各任务。比如可把某用户的所有任务都置于同一队列下等等。用户可自行划分队列,如无设定,则默认所有任务都在队列a。
  3. 这里文件中的各指令各占一行即可,无需使用分号区隔。
  4. 定义任务时,其环境也被记录了,因为实际执行时并不一定满足这样的环境(比如到任务执行时间时,定义此任务的用户都没登录,环境肯定不同)。
    也正因如此,任务中的指令要尽量使用绝对路径,而非只是命令名称。
  5. 对于执行较频繁、且能保证运行结果正确的周期性任务,可把其执行结果重定向至/dev/null。不过错误输出最好还是不要重定向,这样执行发生错误时还是能够发送给用户。
  6. 和at相同,到了执行的时间定义任务的用户未必登录(即环境改变),所以执行的命令尽量使用绝对路径,或在执行的脚本中重新定义环境。
  7. 10 20 25 5 1 COMMAND表示每年5月25日(不论周几)20点10分,和每周一(不论日期)的20点10分,均执行操作。
    即日期和星期如果同时使用,它们是互不干扰的。不过需要这样既指定日期,又指定星期几来执行操作的情况应该并不常见,不太符合人们表述时间的习惯。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值