备注:此笔记总结于马哥课堂笔记

2015-09-16

  linux-计划任务


  定义:

       所谓的计划任务自认为就是服务器每天都有访问压力大的时候和压力小的时候,而根据我们的日常维护所得出一般服务器夜里压力比较小,而我们比如在执行大的操作的时候必须要避开服务器业务高峰和服务器压力过大的时候,所以我们会选择在夜里做操作,而这些操作只是执行一条命令而已,我们为了我们亲身等到后半夜来执行命令,那么我们就用到了计划任务的功能,计划任务也就是一次性或者周期性执行的任务;那么这样linux就为我们准备了两种计划任务,一种是只会执行一次at计划任务和一种可以周期性执行的cron计划任务。

at计划任务

也就是一次性计划任务

用法:

at 选项 时间

时间分为:

绝对时间 所谓的绝对时间就是在几点几分或者哪一年几月的几号几时几分 格式为:HH:MM(15:23)   YY-MM-DD

相对时间 表达方式为now+minute(分钟)   hour(小时) day(天) week(星期)

模糊时间 midnight午夜  noon中午  等

示例:

wKiom1X5Hx7R5nf4AAB2ocPTRnY338.jpg

选项:

     -m 当计划任务执行结束后发邮件给用户

     -l   查看用户计划

     -d  删除用户计划

     -c  查看at 计划的具体内容

     -f   从指定的文件中读取要执行的作业

示例:

wKiom1X5FZOiuLnwAAEStSDcb7A731.jpg

wKioL1X5GLOTiKkqAAFB0gMkiH8814.jpg

-f

wKiom1X5H73gFFx3AAB_yCWMujM158.jpg

我们在第一张图中提示我们没有启动Atd服务,所以我们在使用一次性计划任务的时候需要确保atd服务器是开启的,不然计划任务将不会执行,我们使用 service atd start 来启动,如下图:

wKiom1X5FyLBwlTgAAB5opdUO9E757.jpg


上面我们说了一次性计划任务,但是我们有的时候一个任务需要它反复的去运行,那么我们就用到周期性任务计划了,我们称之为”Cron“

 crontab周期性计划任务

备注:

 cron 和at一样的都需要启动服务,而cron的服务则是crond,所以我们要向使用周期性计划任务时请确保crond是否开启,如不开启计划任务将不会被执行,我们使用 service crond start来开启, 然后使用chkconfig crond on来添加开机启动

示例:

 wKiom1X5IrzDed2qAAHj6I_0RU0145.jpg

周期性任务有两类:

1、系统cron任务;没有默认的运行用户身份,所以需要额外指定运行者

其运行任务在/etc/crontab   一般使用vim来编辑,一般不建议来进行操作

2、用户cron任务;由某个用户所提交;默认是以提交者的身份运行,所以无需额外指定运行者

其运行任务在/var/spool/cron/USERNAME下

crontab命令的作用和用法

作用:为用户维护周期性的计划任务

用法:crontab [选项]

-u 指定计划任务的用户,默认为当前用户,备注:只有root才能去指定其他用户的crontab的权限

-l  查看计划任务

-r  删除计划任务

-e 编辑计划任务

-i  使用-r删除任务时,要求用户确认删除

crontab计划任务格式含义如下图: 使用24小时制,分钟范围0~59,小时范围00~23,日期范围1~31,月范围为1~12 ,周范围为0~7(在这里0和7都可以表示为周日);

时间段的划分:

-   表示一段连续的时间  例:3-7 如果在分钟上就表示3-7分钟这个时间段上执行

, 表示若个不连续的时间   例:3,6,9 表示在每小时的第3分钟 第6分钟 第9分钟

/# 表示在有效范围的每多少时间,表示频率的 例:1-30/4 表示每小时的1-30分钟每4分钟执行一次 */4 则表示每4分钟执行一次

*   表示所有时间  

/   表示间隔时间

示例: 5 */3 * * * /bin/echo "hello"  就表示每3小时第5分执行一次后面的命令

            * */3 * * * /bin/echo "hello"  这就表示每3小时的每分钟都执行一次后面的命令了

所以我们想表示一个时间的每的话,就必须在比它小的单位上指定个时间。

示例:5 7 * * 1-5 /bin/echo "hello" 表示周一到周五每天的7点5分运行一次

其定义模式如下图,我们以系统定义为例:

wKiom1X5LJPyfvJ3AAG1ZClywDM280.jpg

创建计划任务示例:

使用crontab -e 来添加计划任务,备注:后面跟的执行任务要是绝对路径

利用crontab -l 来查看任务

使用crontab -e -u 指定一个用户名,是为其它用户来创建crontab任务

利用crontab -r 来删除计划任务

wKioL1X5iy3DIp4XAAIOYNvrEP4606.jpg

每个crontab 的任务,默认都会

那么我们来做几个练习题,来熟悉一下

1、每周一到周六的凌晨3点20分,运行cp命令对/etc/目录进行归档另存,存储位置为/backups/etc-YYYY-MM-DD;

wKiom1X5j_ngWtHwAACMpbAQnb4247.jpg

2、每周日凌晨2点30分,运行cp命令对/etc/fstab文件进行备份,存储位置为/backup/fstab-YYYY-MM-DD-hh-mm-ss;

wKiom1X5kV3yFtZTAADVAsG2rb0348.jpg

3、每天晚上12点,取得/proc/meminfo文件中所有以S或M开头的行,追加至/statistics/meminfo.txt文件中,且每天的消息之前,要加上类似===============分隔线;

wKioL1X5l0_iBvGEAAFY44qBVIo886.jpg

以下是我在网上找的常见的计划任务示例:

5  * * * * ls 指定每小时的第5分钟执行一次ls命令
30 5 * * * ls 指定每天的 5:30 执行ls命令
30 7 8 * * ls 指定每月8号的7:30分执行ls命令
30 5 8 6 * ls 指定每年的6月8日5:30执行ls命令
30 6 * * 0 ls 指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * * ls 每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
25 8-11 * * * ls 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
*/15 * * * * ls 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
30 6 */10 * * ls 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令 ]

每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件
50 7 * *  * root run-parts  /etc/cron.daily [ 注:run-parts参数表示,执行后面目录中的所有可执行文件

第10、20、30分钟输出到/tmp/cron1.txt:
10,20,30 * * * * echo "第10、20、30分钟输出一次" >> /tmp/cron1.txt