Linux任务计划和周期性任务执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux任务计划和周期性任务执行相关的知识,希望对你有一定的参考价值。

参考技术A

常用选项:
-l 查看作业队列,相当于atq
-f 从某个指定文件文件中读取作业任务,不通过交互式输入。
-d 删除指定的作业任务,相当于atrm。
-c 查看指定作业具体内容。
-q QUEUE指明队列。
TIME时间格式有:
HH:MM 小时:分钟 例如04:00
HH:MM YYYY-MM-DD 小时:分钟 年-月-日 例如15:00 2017-11-25
HH:MM[am|pm] [Month] [Date] 例如:04pm July 30
HH:MM[am|pm] + number [minutes|hours|days|weeks]在某个时间点再加几个时间后执行
例如:now + 5minutes 5分钟后执行
04pm + days三天后下午4点执行

[root@dxlcentOS ~]# at 15:55 2017-11-25 在15点55分执行:切换到tmp目录,执行ls命令
at> cd /tmp
at> ls
at> <EOT>
job 3 at Sat Nov 25 15:55:00 2017
注意:输入结束后按ctrl+d,任务输入结束at> <EOT>,执行结果屏幕不会显示,会以邮件形式发送到邮箱。要是没有mail命令,进行yum -y install mailx安装。

执行周期性任务要确保crond守护进程在运行。
执行pstree,要是crond运行起来可以看到。
或者执行:~]# systemctl status crond (centos7)
Active: active (running) ... ...
centos6:~]# service crond status
... is running

有时候为了安全起见,可以将不允许某些用户执行周期性任务的用户名添加到/etc/cron.deny文件里面即可。
cron任务分类:分系统cron任务和用户cron任务

总结:1.cron周期任务最小时间单位是分钟。
2.定义COMMAND时,如果命令需要用到%,需要对其转义;但放置于单引号中的%不用转义亦可。
3.某任务在指定的时间因关机未能执行,下次开机不会自动执行。
4.当修改之前定好的任务或新增循环任务时最好执行一下systemctl restart crond。
5.如果是系统管理使用的循环任务最好写入/etc/crontab。
6.避免系统资源分配不均,周与日月不可以同时并存。

cron循环任务设定后,要是服务器因意外关机,那么在停机期间,cron设定的循环任务是不会运行的,当服务器开机后,也不会执行过去到达时间点的循环任务,只能等待下个时间点到来才执行。要想重新执行,anacron就可以解决这个问题。
anacron 是一个程序不是一个服务,当centos进入crontab排程时,anacron 会主动每一小时运行一次。

Linux-计划任务

计划任务 cron

计划任务:

让系统在将来的指定时间点执行某些任务(程序);任务可以周期性执行也可以仅仅执行一次。

Linux系统中计划任务:at和cron服务是操作系统内置的2个服务,默认情况是安装好的。

at服务:指定某个时间一次性执行某个任务,依赖于系统后台atd进程

cron服务:指定时间周期性执行某个任务,依赖于系统后台crond进程

 作用: 计划任务主要是做一些周期性的任务,目前最主要的用途是定期备份数据

Schedule one-time tasks with at. 一次性调度执行 at
Schedule recurring jobs with cron. 循环调度执行 cron
Schedule recurring system jobs.
所有计划任务执行中的输出都会以邮件的方式发送给指定用户, 除非重定向

一次性调度执行 at

 at任务计划:

1、确定at这个服务是否安装:

# rpm -q at
at-3.1.10-43.el6_2.1.x86_64

2、相关的文件:

# rpm -ql at |grep etc
/etc/at.deny      用户控制列表,拒绝用户列表/etc/at.allow(默认么有,允许列表);默认是允许所有用户使用at服务
/etc/rc.d/init.d/atd   at服务的启动脚本
/etc/pam.d/atd        验证机制
/usr/bin/at            --命令
/usr/bin/atq           --查看at的任务列表
/usr/bin/atrm          --删除任务
/var/spool/at/xxx      --计划任务的文本文件保存目录

3、常用的命令:

at:制定一个一次性计划任务
-l 列出at任务 等于atq
-d 删除at任务 等于atrm
-c 查看任务内容

4、命令格式:

at 3:30pm    
at 15:30
at 10:10 today
at now+2min           ——2分钟后执行
at 4pm + 3 days        ——3天以后的下午4点运行此job
at 10am Jul 31         ——在7月31日上午10点运行此job
at 1am tomorrow        ——明天上午1点运行此job
at 4:00 2020-12-12     ——在2020-12-12日的凌晨4点执行
at -t 09201430         ——9月20日的下午2:30运行此job
at -t 202009201430     ——2020年的9月20日的下午2:30运行此job
# man at
at now + 5 minutes    任务在5分钟后运行
at now + 1 hour       任务在1小时后运行
at now + 3 days       任务在3天后运行
at now + 2 weeks      任务在两周后运行

crtl + d    --结束

实例:比较复杂的任务可以保存到脚本:

at服务访问控制:

/etc/at.allow  作用:只允许文件里面出现的用户使用atd这个服务,如果这个文件存在,就不去考虑at.deny

/etc/at.deny  作用:只拒绝里面的用户使用atd这个服务, 如果at.allow不存在的时候,才生效

示例

例1:
[[email protected] ~]# at now +1min       --一分钟后执行
at> useradd uuuu  
at> <EOT>
job 1 at Sat Mar 21 22:34:00 2015
[[email protected]~]# atq
3    Thu Mar 30 09:55:00 2017 a root
[[email protected] ~]# id uuuu

例2:
[[email protected]~]# vim at.jobs         ---创建一个文件,名字可以自定义
useradd u99
useradd u00
touch /`date +%F`.txt
[[email protected]~]# at now +1min < at.jobs              一分钟后执行输入这个文件里面的命令并执行

周期性计划任务 crontab

当需要周期性的重复执行任务是可以使用cron服务;该服务每分钟检查一次,并执行符合条件的任务

1、查看服务是否启动

# service crond status

# /etc/init.d/crond status

2、查看相关的文件列表

# which crontab
# rpm -qf /usr/bin/crontab
# rpm -ql crontabs
# rpm -ql cronie
/var/spool/cron  用户级别的计划任务存放目录(以用户命名)
/etc/cron.deny
/etc/pam.d/crond
/etc/rc.d/init.d/crond 启动脚本
/usr/bin/crontab  用户级别的命令
/usr/sbin/crond   二进制的命令

/etc/cron.d/           里面通常存放用来设定除了每天/每周/每月之外的定时任务,比如说每小时周期执行的任务和其他任何定时任务。
/etc/cron.d/0hourly    系统每小时第一分钟需要执行的任务
/etc/cron.deny         用户拒绝列表(在该文件中的用户不能使用cron服务)
/etc/crontab           该文件的作用相当于/etc/cron.d/下面的某一个文件,可以定义系统计划任务。
/var/spool/cron        这个目录用来存放各个用户自己设定的定时任务,普通用户没有权限直接访问,必须通过crontab 命令(setuid)
/etc/cron.monthly/     存放系统每个月需要执行的脚本
/etc/cron.weekly/      存放系统每周需要执行的脚本
/etc/cron.daily/       存放系统每天需要执行的脚本
/etc/cron.hourly/      存放系统每小时需要执行的脚本

3、crontab 格式说明

# cat /etc/crontab    这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。

SHELL=/bin/bash     默认的shell,告诉系统使用哪个shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin   定义命令的路径
MAILTO=root     命令的执行结果以邮件的形式发送给root(不管是标准正确还是错误结果),如果MAILTO=“” ,代表不会发邮件给任何人。
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

前5个字段分别表示:
    分钟:0-59
    小时:0-23
    日期:1-31
    月份:1-12
    星期:0-7(0表示周日或者7表示周日)

还可以用一些特殊符号:
  ,: 表示分割,间隔。如第二个*表示成 8,10,就表示8点和10点
 -:表示一个段,如第二个*表示成 1-5,就表示1到5点
/n : 表示每个n的单位执行一次,如第二个*表示成*/1, 就表示每隔1个小时执行一次命令。

示例

00 02 * * * ls                       //每天2:00整
00 02 1 * * ls                       //每月1号2:00整
00 02 14 2 * ls                      //每年2月14号2:00整
00 02 * * 7 ls                       //每周日2:00整
00 02 * 6 5 ls                       //每年6月的周五2:00整
00 02 14 * 7 ls                      //每月14号2:00整  或者  每周日2:00整,这两个时间都执行
00 02 14 2 7 ls                      //每年2月14号2:00整  或者  每周日2:00整,这两个时间都执行

00 02 * * * ls                       //每天2:00整
*   02 * * * ls                      //每天2:00中的每一分钟
* * * * * ls                         //每分钟执行ls
* * 14 2 * ls                        //2月14号的每分钟 1440分钟

*/5 * * * * ls                       //每隔5分钟
00 02 1,5,8 * * ls                   //每月1,5,8号的2:00整
00 02 1-8 * * ls                     //每月1到8号的2:00整

思考1

如果系统断电或者宕机,错过任务执行的时间,怎么办?

anacron任务:

  是cron服务的扩展,配合cron服务一起使用,当系统断电或者宕机,错过任务执行的时间时,系统启动后它会再次执行未执行的任务。

配置文件:/etc/anacrontab

#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

 

说明:对于每个计划任务,anacrontab先判断period(执行频率)期间内是否被执行了,如果没执行则等待delay(延迟时间),再次执行该任务。

一般情况下该文件不用修改,知道原理就可以。

总结:

1、如果你有很多任务需要每天|周|月重复执行,并且希望系统能自动把漏掉的任务补回来,那么你可以将你的脚本放在系统响应的目录下面/etc/cron.{d{daily,weekly,monthly},并赋予可执行权限。

2、以上需要系统定时去调用的任务将就叫系统级别的计划任务。

示例

通过至少2种方法指定一个周期性的计划任务:

1、stu01用户每周日和周三的凌晨5点04分在查看/etc/hosts文件内容并保存到/tmp/stu01文件中
04 05 * * 0,3 stu01 cat /etc/hosts >/tmp/stu01

vim 1.sh
cat /etc/hosts >/tmp/stu01

04 05 * * 0,3 stu01 /root/1.sh

2、root用户往/tmp/stu01的文件里每隔2分钟追加当前的系统时间

*/2 * * * * root date >>/tmp/stu01

 

 设定用户级别的定时任务

相关命令:

普通用户编辑自己的定时任务
crontab -e               <--- 编辑当前用户自己的定时任务(使用环境变量EDITOR指定的默认编辑器)
crontab -l               <--- 列出当前用户自己所有的定时任务
crontab -r               <--- 删除当前用户自己所有的定时任务


作为管理员,root可以设定/调整所有用户的定时任务,命令和上面类似,只是增加了一个-u <username> 的参数
crontab -e -u redhat        <--- 编辑指定用户的定时任务(使用环境变量EDITOR指定的默认编辑器)
crontab -l -u redhat        <--- 列出指定用户所有的定时任务
crontab -r -u redhat        <--- 删除指定用户所有的定时任务

说明:
1、crontab 默认调用的是vi编辑器,编辑计划任务的用法和vi一样。如果想自己定义编辑器,通过修改环境变量完成。如export EDITOR=vim
2、用户级别的任务定义当中,没有用户名那一栏,如果像定义系统级别的命令那样,输入用户名,crontab编辑器不会提示格式错误,但是任务不会得到正确的执行。
* * * * * command or file.sh or run-parts /dir/
说明:
1、如果执行脚本文件,那么需要有可执行权限,如果没有可以使用bash|sh等指定一种解释器执行
2、如果run-parts,那么后面指定的目录里的所有脚本文件必须要有可执行权限
3、用户级别的计划任务,不需要指定username
4、普通用户不能够直接vim修改自己的计划任务文件(/var/spool/cron/username)

 cron使用限制

/etc/cron.deny          ——只拒绝哪些用户不能他用crontab,默认存在空文件
/etc/cron.allow         ——允许哪些用户使用crontab

如果同一个用户即在拒绝里又在允许里,默认允许优先。

 思考2

如果我用crontab -e 写了晚上8:30去关机,但是我18点就手动关机了,第二天来9点来开机,它会不会延迟一段时间又关机呢?

 答案:不会

示例

备份etc目录,要求:
1. 每天4:00备份/etc目录到/var/back
mkdir /var/back
tar -czf /var/back/$(date +%F)_etc.tar.gz /etc
00 04 * * *

2. 将备份命令写在脚本中,如/root/back.sh,加执行权限
vim /root/back.sh
tar -czf /var/back/$(date +%F)_etc.tar.gz /etc

chmod +x /root/back.sh

3. 每天备份的文件名包含当天的日期,如2016-11-09_etc.tar.gz
4. 计划任务执行时,屏幕不产生任何输出
00 04 * * * /root/back.sh &>/dev/null 
5. 只保留最近5天的备份 
find /var/back -ctime +5 -exec rm -f {} ;
find /var/back -ctime +5 |xargs rm -f

vim /root/bak.sh
mkdir /var/back
tar -czf /var/back/$(date +%F)_etc.tar.gz /etc
find /var/back -ctime +5 -exec rm -f {} ;

chmod +x /root/bak.sh

crontabe:
00 04 * * * bash /root/bak.sh
#!/bin/bash dir=/var/back #判断备份的目录是否存在,如果不存在就创建它 [ ! -d $dir ] && mkdir $dir #备份/etc目录,使用tar工具 tar -czvf $dir/$(date +%F)_etc.tar.gz /etc #备份的文件只需要保留5天以内 find $dir -ctime +5 -exec rm -f {} ; crontabe: 00 04 * * * bash /root/bak.sh

 

以上是关于Linux任务计划和周期性任务执行的主要内容,如果未能解决你的问题,请参考以下文章

Linux中计划任务周期性任务设置

Linux任务计划和周期性任务执行

linux计划任务管理

linux-计划任务atcrontab

Linux任务计划周期性任务执行

Linux计划任务.md