1,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 下面的所有内容, 以实现任务的执行.
2,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.
3,crontab 命令
crontab [-u user] [-l | -r | -e] [-i]
-u user: 用来设定某个用户的 crontab 服务, 例如,"-u ixdba" 表示设定 ixdba 用户的 crontab 服务, 此参数一般有 root 用户来运行.
file:file 是命令文件的名字, 表示将 file 做为 crontab 的任务列表文件并载入 crontab. 如果在命令行中没有指定这个文件, crontab 命令将接受标准输入 (键盘) 上键入的命令, 并将它们
载入 crontab.
-e: 编辑某个用户的 crontab 文件内容. 如果不指定用户, 则表示编辑当前用户的 crontab 文件.
-l: 显示某个用户的 crontab 文件内容, 如果不指定用户, 则表示显示当前用户的 crontab 文件内容.
-r: 从 / var/spool/cron 目录中删除某个用户的 crontab 文件, 如果不指定用户, 则默认删除当前用户的 crontab 文件.
-i: 在删除用户的 crontab 文件时给确认提示.
4,crontab 语法
crond 是 linux 下用来周期性的执行某种任务或等待处理某些事件的一个守护进程, 与 windows 下的计划任务类似, 当安装完成操作系统后, 默认会安装此服务 工具, 并且会自动启动 crond 进程, crond 进程每分钟会定期检查是否有要执行的任务, 如果有要执行的任务, 则自动执行该任务.
Linux 下的任务调度分为两类, 系统任务调度和用户任务调度.
系统任务调度: 系统周期性所要执行的工作, 比如写缓存数据到硬盘, 日志清理等. 在 / etc 目录下有一个 crontab 文件, 这个就是系统任务调度的配置文件.
1, 系统 cron 任务
系统的 crontab 存放在 /etc/crontab
- # vim /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
a, 每一行定义一个周期性任务, 共 7 个字段.
b, 此处的环境变量不同于用户登录后获得的环境, 因此建议命令使用绝对路径.
c, 执行结果会发送邮件给 mailto 指定的用户.
2, 用户 cron 任务
用户的 crontab 文件存放在 /var/spool/cron/USERNAME
# crontab -e -u USERNAME
a, 每一行定义一个周期性任务, 共 6 个字段.
b, 此处的环境变量不同于用户登录后获得的环境, 因此建议命令使用绝对路径.
c, 执行结果会发送邮件给当前用户.
星号 (*) 匹配所有有效的值.
短横线 (-) 表示范围连续取值.
逗号 (,) 表示离散取值.
正斜线 (/) 指定间隔频率. 例如, 0-59/2 在分钟字段表示每两分钟.
指定的时间点不能被步长整除时, 其意义将不存在. 例如 */7 * * * *
注意:% 在 crontab 中被认为是 newline, 使用时需要用 \ 转义. 比如 crontab 文件中, 如果有 "date +%Y%m%d", 必须替换为:"date +\%Y\%m\%d".
crontab 的最小时间单位为 "分钟", 想完成 "秒" 级任务, 得需要借助于其它方式.
先定义为每分钟任务, 再利用脚本实现在每分钟之内, 循环执行多次.
sleep 命令
delay for a specified amount of time.
s: 秒, 默认单位
m: 分
h: 小时
d: 天
usleep 命令
- sleep some number of microseconds.The default is 1.
- # usleep 1000000 休眠 1 秒
示例:
*/5 * * * * 每 5 分钟执行一次
3 * * * * 每小时的第 3 分钟执行一次
3 4 * * 5 每周 5 的 4 点 3 分执行一次
5 6 7 * * 每月的 7 号的 6 点 5 分执行一次
7 8 9 10 * 每年的 10 月 9 号 8 点 7 分执行一次
9 8 * * 3,7 每周 3 和周日的 8 点 9 分
0 8,20 * * 3,7 每周 3 和周日的 8 点和 20 点执行一次
0 9-18 * * 1-5 周一到周五的 9-18 点, 即工作时间内的每小时
0 7 25 12 * 每年的 12 月 25 号 7 点执行一次
5,crontab 服务
安装 crontab:
yum install crontabs
服务操作说明:
- /sbin/service crond start // 启动服务
- /sbin/service crond stop // 关闭服务
- /sbin/service crond restart // 重启服务
- /sbin/service crond reload // 重新载入配置
- /sbin/service crond status // 启动服务
查看 crontab 服务是否已设置为开机启动, 执行命令:
ntsysv
加入开机自动启动:
chkconfig -level 35 crond on
6, 常用方法
1). 创建一个新的 crontab 文件
在考虑向 cron 进程提交一个 crontab 文件之前, 首先要做的一件事情就是设置环境变量 EDITOR.cron 进程根据它来确定使用哪个编辑器编辑 crontab 文件. 99% 的 UNIX 和 LINUX 用户都使用 vi, 如果你也是这样, 那么你就编辑 $ HOME 目录下的. profile 文件, 在其 中加入这样一行:
EDITOR=vi; export EDITOR
然后保存并退出. 不妨创建一个名为 < user> cron 的文件, 其中 < user > 是用户名, 例如, davecron. 在该文件中加入如下的内容.
- # (put your own initials here)echo the date to the console every
- # 15minutes between 6pm and 6am
- 0,15,30,45 18-06 * * */bin/echo 'date'> /dev/console
保存并退出. 确信前面 5 个域用空格分隔.
在上面的例子中, 系统将每隔 1 5 分钟向控制台输出一次当前时间. 如果系统崩溃或挂起, 从最后所显示的时间就可以一眼看出系统是什么时间停止工作的. 在有些 系统中, 用 tty1 来表示控制台, 可以根据实际情况对上面的例子进行相应的修改. 为了提交你刚刚创建的 crontab 文件, 可以把这个新创建的文件作为 cron 命令的参数:
$ crontab davecron
现在该文件已经提交给 cron 进程, 它将每隔 15 分钟运行一次.
同时, 新创建文件的一个副本已经被放在 / var/spool/cron 目录中, 文件名就是用户名(即 dave).
2). 列出 crontab 文件
为了列出 crontab 文件, 可以用:
- $ crontab -l
- 0,15,30,45,18-06 * * */bin/echo `date`> dev/tty1
你将会看到和上面类似的内容. 可以使用这种方法在 $HOME 目录中对 crontab 文件做一备份:
$ crontab -l> $HOME/mycron
这样, 一旦不小心误删了 crontab 文件, 可以用上一节所讲述的方法迅速恢复.
3). 编辑 crontab 文件
如果希望添加, 删除或编辑 crontab 文件中的条目, 而 E D I TO R 环境变量又设置为 v i, 那么就可以用 v i 来编辑 crontab 文件, 相应的命令为:
$ crontab -e
可以像使用 vi 编辑其他任何文件那样修改 crontab 文件并退出. 如果修改了某些条目或添加了新的条目, 那么在保存该文件时, cron 会对其进行必要的完整性检查. 如果其中的某个域出现了超出允许范围的值, 它会提示你.
我们在编辑 crontab 文件时, 没准会加入新的条目. 例如, 加入下面的一条:
- # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
- 30 3 1,7,14,21,26 * */bin/find -name "core' -exec rm {} \;
现在保存并退出. 最好在 crontab 文件的每一个条目之上加入一条注释, 这样就可以知道它的功能, 运行时间, 更为重要的是, 知道这是哪位用户的作业.
现在让我们使用前面讲过的 crontab -l 命令列出它的全部信息:
- $ crontab -l
- # (crondave installed on Tue May 4 13:07:43 1999)
- # DT:ech the date to the console every 30 minites
- 0,15,30,45 18-06 * * */bin/echo `date`> /dev/tty1
- # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
- 30 3 1,7,14,21,26 * */bin/find -name "core' -exec rm {} \;
4). 删除 crontab 文件
要删除 crontab 文件, 可以用:
$ crontab -r
5). 恢复丢失的 crontab 文件
如果不小心误删了 crontab 文件, 假设你在自己的 $HOME 目录下还有一个备份, 那么可以将其拷贝到 / var/spool/cron/<username>, 其中 < username > 是用户名. 如果由于权限问题无法完成拷贝, 可以用:
$ crontab <filename>
其中,<filename > 是你在 $HOME 目录中副本的文件名.
我建议你在自己的 $HOME 目录中保存一个该文件的副本. 我就有过类似的经历, 有数次误删了 crontab 文件(因为 r 键紧挨在 e 键的右边). 这就是为什么有些系统文档建议不要直接编辑 crontab 文件, 而是编辑该文件的一个副本, 然后重新提交新的文件.
有些 crontab 的变体有些怪异, 所以在使用 crontab 命令时要格外小心. 如果遗漏了任何选项, crontab 可能会打开一个空文件, 或者看起来像是个空文件. 这时敲 delete 键退出, 不要按 < Ctrl-D>, 否则你将丢失 crontab 文件.
来源: http://www.bubuko.com/infodetail-2688285.html