menu Alkaid #二进制初学者 / 网络安全 / 大龄CTF退役选手
Crontab不知疲倦的时间表
270 浏览 | 2018-07-01 | 分类:Linux | 标签:linux

Crontab简介

 

crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。

crontab文件包含送交cron守护进程的一系列作业和指令。每个用户可以拥有自己的crontab文件;同时,操作系统保存一个针对整个系统的crontab文件,该文件通常是/etc/crontab,而这个文件只能由系统管理员来修改。

cronie:主程序包,提供crond守护进程及相关辅助工具。

# rpm -ql cronie 
/etc/cron.d 
/etc/cron.d/0hourly 
/etc/cron.deny #权限控制,黑名单 
/etc/pam.d/crond 
/etc/sysconfig/crond 
/usr/bin/crontab 
/usr/lib/systemd/system/crond.service 
/usr/sbin/crond
/var/spool/cron

crontabs:系统自带的一些计划任务。

# rpm -ql crontabs 
/etc/cron.daily 
/etc/cron.hourly 
/etc/cron.monthly 
/etc/cron.weekly 
/etc/crontab 
/etc/sysconfig/run-parts 
/usr/bin/run-parts

cronie-anacron:cronie的补充程序,用于监控cronie任务的执行状况。

# rpm -ql cronie-anacron 
/etc/anacrontab
/etc/cron.hourly/0anacron 
/usr/sbin/anacron 
/var/spool/anacron 
/var/spool/anacron/cron.daily 
/var/spool/anacron/cron.monthly 
/var/spool/anacron/cron.weekly

对于24小时开机运行的服务器可能用不到的,但是对非24小时开机,又想定时运行任务的机器还是十分有用的。

anacrontab负责执行 /etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly 中的系统任务。
当执行任务时,更新/var/spool/anacron/文件的时间戳。

anacron的配置与cron类似,也是要首先配置一个叫anacrontab的文件,其文件格式说明一般在manual里有man anacrontab

# vim /etc/anacrontab  

@reboot : Run once after reboot. 
@yearly : Run once a year, ie. "0 0 1 1 *". 
@annually : Run once a year, ie. "0 0 1 1 *". 
@monthly : Run once a month, ie. "0 0 1 * *". 
@weekly : Run once a week, ie. "0 0 * * 0". 
@daily : Run once a day, ie. "0 0 * * *". 
@hourly : Run once an hour, ie. "0 * * * *".

anacron的工作原理参考这里:http://blog.csdn.net/deerlux/article/details/51090531


crontab在 /etc 目录下面存在 cron.d、cron.daily、cron.weekly、cron.monthly、cron.hourly 五个目录和 crontab、cron.deny 二个文件。

cron.daily是每天执行一次的job 
cron.weekly是每个星期执行一次的job 
cron.monthly是每月执行一次的job 
cron.hourly是每个小时执行一次的job 
cron.d是系统自动定期需要执行的任务,如果不是按小时,按天,按星期,按月来执行的,那么就放在这个目录下面。 
如果是按小时,按天,按星期,按月的来执行的话,则可以放到前面相应的目录下面去。 
/etc/cron.hourly/ 的执行任务定义在 /etc/cron.d/0hourly 文件中。

在/var/spool下面存在着两个目录cron,anacron。

/var/spool/cron 目录下面是每个用户自己通过 crontab -e 增加的crontab的内容。 
/var/spool/anacron 目录下面是记录的是cron.daily,cron.monthly,cron.weekly上一次执行的时间。

crond服务每隔一分钟去读取一次/var/spool/cron,/etc/crontab,/etc/cron.d 下面的所有内容,以实现任务的执行。


crontab的权限控制

/etc/cron.allow 和 /etc/cron.deny 文件被用来限制对 cron 的使用。
这两个控制文件的格式都是每行一个用户。两个文件都不允许有空格。
如果控制文件被修改了,cron守护进程 crond 不必重启。控制文件在每次用户添加或删除一项 cron 任务时都会被读取。

/etc/cron.allow 的优先级高于 /etc/cron.deny。
如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且cron.deny 文件会被忽略。
如果 cron.allow 文件不存在,所有在cron.deny 中列出的用户都被禁止使用 cron。

crontab命令

crontab [-u user] [-l | -r | -e] [-i] 
-l:列出当前用户的计划任务。 
-e:编辑当前用户的计划任务。 
-r:删除当前用户的所有计划任务,即删除/var/spool/cron/USERNAME文件。 
-u:管理指定用户的计划任务,仅root有权限。 
-i:在使用-r选项删除所有任务时提示用户确认。

crontab -e

crontab -e 命令可以在vi中编辑任务, 如下面代码每一分钟向文本写入当前日期

* * * * * date >> ~/log.txt

创建任务后, 可以用 crontab -l 查看当前用户的任务列表

 

命令格式如下:

分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天)  命令

*                *               *                 *                          *              command

  • minute: 表示分钟,可以是从0到59之间的任何整数。
  • hour:表示小时,可以是从0到23之间的任何整数。
  • day:表示日期,可以是从1到31之间的任何整数。
  • month:表示月份,可以是从1到12之间的任何整数。
  • week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
  • command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段中,还可以使用以下特殊字符:

  • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

 

例子:

每晚21:30重启apache 
30 21 * * * service httpd restart 
每月的1, 10, 22日的4:55分重启apache, 用','号分割 
55 4 1,10,22 * * service httpd restart 
每月的1到10日重启apache, 用-号表示区间 
* * 1-10 * * service httpd restart 
每隔2分钟重启apache , 这里的 */2 号 表示从0.0秒开始每隔2分钟执行 
*/2 * * * * service httpd restart 
每晚11点到早上7点每隔1小时重启服务器, 注意分钟是用0而不是* 假如是*则代表每分钟都在执行 
0 23-7/1 * * * service httpd restart 
每天18点到23点每隔30分钟重启服务器, 两种写法都可以 
*/30 18-23 * * * service httpd restart 
0,30 18-23 * * * service httpd restart

 

或者利用shell脚本和crontab进行配合:

例如下面的shell脚本,一个对目录进行打包,并按时间命名:

#!/bin/bash

basedir=/home/script

src=$basedir/src/$(date "+%F_%H%M")

[  ! -d "$src"  ] && mkdir -p $src

cd /home/

tar -jpcf $src/www.tar.bz2 script

直接将其利用命令加入:

crontab -e
* * * * * sh /home/script/backup.sh

重启crond服务:

service restart cron
温柔正确的人总是难以生存,因为这世界既不温柔,也不正确

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!