Linux定时任务

明月清风 2016-11-06 96浏览
首页/正文
分享到: / / / /

Linux 任务调度种类: 单一任务:at命令,仅执行一次,必须要有atd服务支持。 循环任务:crontab命令,定时循环。

单一任务

使用单一任务调度时,必须要有atd这个调度服务的支持。不过有的系统未默认开启此服务,可能需要我们手动启用。

centos 7:

[root@ZhangSir ~]#systemctl start atd   //启动
[root@ZhangSir ~]#systemctl enable atd  //开机自启动

centos 6:

[root@ZhangSir ~]#atd start   //启动
[root@ZhangSir ~]#chkconfig atd on   //开机自启动

at的运作方式:

使用at命令生成所需运行的工作,并将这个工作以文本文件的方式写入**/var/spool/at/**目录内,该工作才能被atd服务调取并执行。

at 和 batch 从标准输入或一个指定的文件读取命令,这些命令在以后 某个时间用 /bin/sh 执行。

at的使用限制管理:

/etc/at.allow:白名单,只有此名单内用户可以使用at。

/etc/at.deny:黑名单,此名单内用户无法使用at,其他用户可用(优先读取at.allow,若此文件不存在,则读取at.deny;若at.deny为空,则所有用户都可执行at。【默认】)。

若两个文件都不存在,则只有root可以使用at。

at:实行单一任务调度

**at 选项 **

常用参数:

  • -q:使用指定的队列。一个队列用一个字母标定,有效的的队列标定的范围是从a到z和从A到Z。
  • -m:当作业完成时即使没有输出也给用户发邮件。
  • -f FILE:从文件而不是标准输入中读取作业信息。
  • -l:列出用户的等待执行的作业;在用户是超级用户的情况下,列出所有人的作业(atq别名)。
  • -d:删除作业(atrm别名)。
  • -v:显示完整的在队列中未被删除的作业,对于其他命令,显示作业将要执行的时间。
  • -c:连接命令行中列出的作业并输出到标准输出。 时间格式:定义何时进行at这项工作。 HH:MM 如:04:00 当天何时进行,若已过此时间,则推迟至下一天的此时。 HH:MM YYYY-MM-DD 如:05::00 2016-11-16 定义于某年某月某日某时某分执行此任务。 HH:MM + number [minutes|hours|days|weeks] 如:06:00 + 5 hours 或 now + 5 minutes 定义于当天某时刻后多长时间执行,now + 表示当前时刻多少时间后。

当使用at命令时,会进入一个at shell 的环境来让用户执行工作命令,此时,最好使用绝对路径来执行命令。

由于命令的执行与PATH变量有关,同时与当时的工作目录有关,因此使用绝对路径来执行命令会比较安全。

如:在/tmp 下执行“at now” 然后输入“mail root -s "test” <.bashrc",此时at会在当前工作目录寻找 .bashrc . at命令的所有标准输出与标准错误输出都会以email发送给用户。

at 命令的执行内容是在后台执行,所以不用担心终端断开而导致任务中断。 示例:添加定时关机

[root@ZhangSir ~]#at 23:00
at> /bin/sync
at> /sbin/shutdown -h now
at> <EOT>
job 1 at Mon Nov 14 23:00:00 2016

查询正在排队的任务

[root@ZhangSir ~]#at -l
1 Mon Nov 14 23:00:00 2016 a root

查看第一个任务

[root@ZhangSir ~]#at -c 1
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
......
 echo 'Execution directory inaccessible' >&2
 exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER55051496'
/bin/sync
/sbin/shutdown -h now
......

删除第一个任务

[root@ZhangSir ~]#at -d 1

batch:闲时执行

其实 batch 还是利用 at 来执行任务的,只是加入了一些控制参数,其用法与 at 一样,不过他能在 CPU 的负载小于 0.8 的时候才执行指定的工作任务。

循环任务

循环任务调度是由 cron(crond)这个系统服务控制的,Linux 上的很多默认任务都是这个服务在控制者,因此这个服务都是默认启动的。用户可以使用 crontab 来管理调度循环任务。

crontab的运作方式:

当用户使用 crontab 创建工作后,该项工作会被记录到/var/spool/cron/里面,而且是以账号最为判别的,crontab执行的每一项工作都会被记录到 /var/log/cron 这个日志文件中。

/etc/cron.allow:白名单,只有此名单内用户可使用crontab。(优先高,若此文件在,则不读黑名单。)

/etc/cron.deny:黑名单,此名单内用户无法使用crontab,其他用户可用。

crontab:实行循环任务调度

crontab 选项

常用选项:

  • -u:指定用户创建任务,只有root可用。
  • -e:编辑crontab的工作内容。
  • -l:查阅crontab的工作内容。
  • -r:删除所有crontab的工作内容,若要删除一项用 -e 编辑。
代表意义 分钟 小时 日期 月份 命令
数字范围 0-59 0-23 1-31 1-12 0-7 执行的命令

其中周的定义里,“0”或者“7”都代表了星期天。 特殊字符含义:

特殊字符 代表意义
*(星号) 代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是 * , 就代表著『不论何月、何日的礼拜几的 12:00 都运行后续命令』的意思!
,(逗号) 代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是:0 3,6 * * * command 时间参数还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用!
-(减号) 代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作:20 8-12 * * * command 仔细看到第二栏变成 8-12 !代表 8,9,10,11,12 都适用的意思!
/n(斜线) 那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则:*/5 * * * * command 很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!

系统任务 /etc/crontab 这个文件是系统默认会定时执行的系统任务,cron 服务会每隔一分钟读取/etc/crontab与/varspool/cron里面的内容。

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

# 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

SHELL=/bin/bash:使用的shell,还记得脚本文件的#!/bin/bash不。 PATH=……:定义路径到变量。

MAILTO=root:若有额外STDOUT,以 email 将数据发送给谁,可以改成你的email地址,以便接收任务的执行信息。

其中比crontab -e 命令多了一项,便是用户名称了,因为用户执行命令会以用户身份生成配置文件,而这个文件中若是填入任务的话,系统就需要指定用户的身份了。

并且其中还支持以目录来规划任务,可以将可执行文件放在一个目录中,然后再命令处填写 run-parts(有空格)然后接上目录,即可借助run-parts这个脚本的辅助,来规划目录执行了。

其中所有的输出会以email形式,发送预设的账号,所以不必要的输出可以重定向给/dev/null 避免垃圾邮件。

其中日、月、周不可同时存在,若是同时存在,系统默认执行第一个读取到的时间做循环。

anacron

crontab的任务都是定时循环执行,若是那个时刻处于关机状态,那么任务就无法执行了,为了弥补这个问题,就有了anacron。其能够将为能运行的crontab工作在开机之后执行。

aracron也是基于crontab来运行的,因此aracron运行的时间通常有两个,一个是系统开机期间运行,一个是写入crontab 的调度之中,这样才能够在特定的时间分析系统中未运行的crontab 工作。

**anacron 选项 **

常用选项:

  • -s:开始连续执行各项crontab未能执行的任务(根据时间记录判断)。
  • -f:强制执行任务而不去判断。
  • -n:立即执行未执行的任务,而不延迟等待时间。
  • -u:仅更新时间记录文件,而不进行任何工作。

任务:由/etc/anacrontab 定义的各项任务名称。

[root@ZhangSir ~]#cat /etc/anacrontab 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
最后修改:2016-11-06 21:13:35 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇