Linux shell编程之控制脚本之定时运行

目录

控制脚本之定时运行

①cron时间表(系统不关机情况下)

②与cron相关的文件和目录

③anacron

④crontab定时任务

定时任务实战

 


 

cron时间表(系统不关机情况下)

>>>Linux使用cron程序(通过检查cron时间表)来计划要定期执行的脚本

>>>每个用户(包括root)都有自身的cron时间表,Linux提供了crontab命令来处理时间表

>>>默认不存在,使用crontab命令来创建计划任务,将任务写入文件,写入时会检查语法格式是否正确

>>>当系统进行系统初始化时,cron从/etc/init.d中启动

>>>cron进程会去搜索/var/spool/cron目录下的crontab文件,并将其加载到内存中

[root@localhost ~]# ll /var/spool/cron

total 8

-rw-------. 1 bei  bei  27 Sep 26 01:50 bei

-r--------. 1 root root 40 Aug  6 04:48 root

>>>cron进程还会去搜索/etc/anacrontab(天周月相关文件)和/etc/cron.d目录下的文件(小时相关文件)

>>>定时任务运行时与命令行的环境变量不一样

 

cron有两种方式可以检查cron tables的变化

>>>检查对应的定时任务文件的modtime

>>>使用inotify:启动守护进程后,inotify会被记录到/var/log/cron这个日志文件中

 

cron时间表格式(时间戳 user-name command to be executed)

时间戳每个字段如下(建议都用数字表示)

field时间戳

minute

hour

day of month

month

day of week

allowed values

0-59

0-23

1-31

1-12 or janfebmar

0-6 or sunmontue …

# 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

说明

>>>每个字段可能包含星号 * ,表示"first-last"

>>>每个字段允许用数字范围表示的,范围是指用连字符“-”分隔的两个数字,注意是闭区间

例:"0-6"表示的是:0,1,2,3,4,5,6

想要表示一组数字或范围,可以用列表,用逗号","分隔的一组数字("1,2,3,4,5"或"10-12,15-17,19-21")

但是,使用英文前三个字母表示的时候,不能用"-"表示一个范围

>>>步长值可与范围结合使用"/<number>"

在范围后面带有"/<number>",表示在范围内跳过的数字的值

例:天数取“1-31/2”,表示1,3,5……,29,31,即只取每个月的单数天

>>>使用名称表示字段时,不允许使用范围或列表方式(只能一个名称)

>>>第六个字段,指定要运行的命令,直到遇到换行符或%符号(当需要用到%用\转义)

>>>命令执行的日期可以在两个字段:day of month和day of week指定,如果两个字段都收到限制,当任一字段与当前时间匹配,则认为当前时间应该被执行,

例:"0 0 1,15 * 0"表示每个月的1号,15号和每个星期日的00:00是定时时间

 


 

②与cron相关的文件和目录

>>>/etc/crontab文件:系统级别的定时任务,只有root可以修改

该文件默认情况下是空的,常用于运行每日、每周、每月的作业

文件内容如下:

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin             #系统级别定时任务和系统的环境变量是不一样的

MAILTO=root

HOME=/

# For details see man 4 crontabs

 

>>>/etc/cron.d

这个目录的作用是每小时运行/etc/cron.hourly的定时任务

 


 

anacron

>>>解决机器不连续工作,定时任务过期问题,当服务器不连续工作,重新启动就回去运行之前定时任务未执行的作业

>>>/etc/cron.d 每小时会执行一次anacron

>>>anacron以天为单位,当天的定时任务不会运行

>>>使用-s选项,只有当上一次作业结束,才会运行下一个作业

>>>时间戳存在/var/spool/anacron目录

 


 

crontab定时任务

>>>crontab命令是用于创建、删除或列出用于服务cron守护程序表的程序

>>>crontab创建的定时任务存放在/var/spool/cron目录下(用户无法编辑,只能用crontab命令去编辑)

[root@localhost ~]# ls -al /var/spool/cron

total 16

drwx------.  2 root root 4096 Sep 27 00:35 .

drwxr-xr-x. 13 root root 4096 Jun 24 10:46 ..

-rw-------.  1 bei  bei    27 Sep 26 01:50 bei

-r--------.  1 root root   40 Aug  6 04:48 root

[root@localhost ~]#

[root@localhost ~]# ls -al /usr/bin/crontab

-rwsr-xr-x. 1 root root 51784 Aug 23  2016 /usr/bin/crontab

说明:用户无法编辑是因为没有对/var/spool/cron这个目录的写权限,

          用户可以用crontab命令去编辑/var/spool/cron目录下自己的文件,是因为/usr/bin/crontab有suid权限

          当/usr/bin/crontab被启动为一个进程,用户就拥有了属主root的权限去创建,修改,删除自己的定时任务了

>>>对于不同用户。可以设置/etc/cron.allow和/etc/cron.deny,去禁止某些用户使用定时任务

     这两个文件只用其中一个,若两个文件不存在,则是有root可以用定时任务

命令格式:crontab [-u user] -e | -l | -r

命令

描述

-u

root指定操作哪个用户的文件

-e

编辑某个用户crontab文件内容

-l

列出某个用户crontab文件内容

-r

删除某个用户crontab文件内容

-i

交互式确认删除crontab文件

 


 

定时任务实战

>>>每分钟执行一次 commands

* * * * * commands

>>>每小时的第3和第15分钟执行 commands

3,15 * * * * commands

>>>在上午的8点到11点的第3和第15分钟执行 commands

3,15 8-11 * * * commands

>>>每隔一天的上午8点到11点的第3和第15分钟执行 commands     

3,15 8-11 */2 * * commands

>>>每周一上午8点到11点的第3和第15分钟执行 commands

3,15 8-11 * * 1 commands

>>>每晚的21:30重启networking

30 21 * * * /etc/init.d/networking restart

>>>每月1,20,22的的4.45重启networking 

45 4 1,20,22 * * /etc/init.d/networking restart

>>>每周六、日的01:10重启networking

10 1 * * 0,6 /etc/init.d/networking restart

>>>每天18:00至23:00之间每隔30分钟重启networking

0,30 18-23 * * * /etc/init.d/networking restart

思考题:如何在每个月的最后一天中午12:00执行commands

0 12 * * * if [ `date +%d -d tomorrow` -eq 1 ];then commands;fi

说明:这里使用if-then语句,用来判断明天是不是1号,若是1号,则执行commands

 

 

 


说明:

>>>以上内容是本人学习的总结

>>>如还有错误,请留言,指正

>>>亦可分享自己的想法,互相学习

猜你喜欢

转载自blog.csdn.net/Mr_Bei/article/details/82871926
今日推荐