Crontab配置及使用总结:
Crontab服务是Unix/Linux下的工业级服务,使用它可以设置周期性的任务执行,不需要常驻程序,这对程序的要求高度以及系统的性能开销起到积极作用。Crontab是Unix/Linux下主要的调度进程,不需人工干扰下作业,并且其可以允许用户提交、编辑及删除对应的任务作业,另外,每个用户都拥有一个Crontab文件保存调度信息,管理员可以通过编辑cron.deny及cron.allow两个文件禁止或许可用户拥有Contab。
· 工作原理
· 语法格式
· 配置说明
· 任务管理
· 定时任务
· 注意事项
1、工作原理
当使用 crontab 命令来创建工作任务后,该项工作就会被记录到/var/spool/cron/,而且是以帐号来作为判别的。例如,keysd 使用 crontab 后, 他的工作会被纪录到 /var/spool/cron/ keysd中,但请不要使用 vi 直接编辑该文件,因为可能由于输入语法错误,导致无法运行 cron 服务。另外,cron 运行的每一项工作都会被记录到 /var/log/cron 这个档中,所以,如果你的 Linux /unix不知道是否被植入木马时,也可以搜寻一下 /var/log/cron 这个登录档。
crond服务的最低侦测限制是分钟,所以,cron会每分钟去读取一次 /etc/crontab 与/var/spool/cron 里面的数据内容,只要你编辑 /etc/crontab 这个文件,并且将它储存之后,那么 cron 的配置就自动的运行了。
NOTE:
在 Linux/unix 下的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事项,但是某些原因或者是其他的Unix/linux系统中,由于crontab 是读到内存当中的,所以在你修改完 /etc/crontab 之后,可能并不会马上运行, 这个时候请重新启动 crond 这个服务:/etc/init.d/crond restart。
2、语法格式
A、格式说明
Crontab任务都是6个档位,它们的具体意义如下表:
分钟 |
小时 |
日期 |
月份 |
周 |
命令 |
0-59 |
0-23 |
1-31 |
1-12 |
0-7 |
command |
B、特殊字符
字符名字 |
作用 |
* |
代表任何时间都适合执行任务 |
, |
代表分割时间段执行任务 |
- |
代表一段时间内执行任务 |
/n |
n为数字,代表每隔n分钟执行任务 |
NOTE:
每天早上4点:
0 4 * * * command
每天3个小时:
0 */3 * * * command
晚上12点到早上4点间每3个小时:
0 24-4/2 * * * command
每个月的5号和每个礼拜的周一到周三早上4点:
0 4 5 * 1-3 command
12月24日早上8点
0 8 24 12 * command
3、配置说明
A、crontab位置
crontab文件一般在/etc下,需要结合实际系统版本来定:
#more /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
…
#run-parts
1 * * * * root run-parts /etc/cron.hourly
2 4 * * * root run-parts /etc/cron.daily
23 4 * * 0 root run-parts /etc/cron.weekly
24 4 1 * * root run-parts /etc/cron.monthly
B、独立的crontab文件
因为每个用户都会自动生成一个自己的crontab文件,一般位于/var/spool/cron下:
#cd /var/spool/cron
#ls
mysql root
…
NOTE:
若使用了crontab -r删除了对应的mysql ,那么目录下对应的文件mysql被删除
C、crontab配置文件
Crontab分为用户档和系统档两种设计,也就是使用crontab -e(/usr/bin/crontab运行档)是针对使用的用户档cron的,而系统的例行任务,是需要配置/etc/crontab文件(需要使用root身份编辑哦),crontab内容如下:
cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
* * * * root cd / && run-parts --report /etc/cron.hourly
6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report/etc/cron.daily )
6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report/etc/cron.weekly )
6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report/etc/cron.monthly )
NOTE:
/etc/crontab 里面预配置义出4项工作任务,分别是每小时、每天、每周及每个月分别进行一次的工作,但是在五个栏位后面接的并不是命令,而是一个新的栏位,就是『运行后面那串命令的身份』这与使用者的 crontab -e 不相同。由於使用者自己的 crontab 并不需要指定身份,但 /etc/crontab 里面当然要指定身份。
那么后面那串命令是什么呢?你可以使用『which run-parts』搜寻看看,那是一个 bash script,如果你直接进入/usr/bin/run-parts 去看,会发现这支命令会将后面接的『目录』内的所有文件捉出来运行!这也就是说『如果你想让系统每小时主动帮你运行某个命令,将该命令写成 script,并将该文件放置到 /etc/cron.hourly/ 目录下即可了。
现在你知道系统是如何进行他默认的一堆例行性工作排程了吗?如果你下达『 ll /etc/cron.daily 』就可以看到一堆文件, 那些文件就是系统提供的script ,而这堆 scripts 将会在每天的凌晨6:25 开始运行!
假设你现在要作一个目录,让系统可以每 2 分钟去运行这个目录下的所有可以运行的文件,你可以写下如下的这一行在/etc/crontab 中:
*/2 * * * * root run-parts /etc/cron.min
当然,/etc/cron.min 这个目录是需要存在的,如果我需要运行的是一个『程序』, 不需要用到一个目录呢?例如在侦测网络流量时,我们希望每五分钟侦测分析一次:
*/5 * * * * root /bin/mrtg /etc/mrtg/mrtg.cfg
创建例行性命令很简,如果你是系统管理员而且你的工作又是系统维护方面的例行任务时,直接修改 /etc/crontab 这个文件即可!
4、任务管理
A、语法格式
crontab [-u username] [-l][-e][-r]
NOTE:
-u:设定某个用户的cron服务,一般root用户使用它为其它用户指定cron;
-l:列出某个用户的cron服务列表;
-e:编辑某个用户的cron服务;
-r:删除某个用户的cron服务;
B、任务管理
例如:
//root用户查看自己的cron服务:
sudo crontab -u root -l
//root用户删除heysd的cron服务:
sudo crontab -u heysd -r
//root编辑cron服务:
sudo crontab –u root -e
NOTE:
-e:编辑时进入vim/vi模式,输入的内容必须符合语法格式,例如:0 8 24 12 * command
5、用户限制
通过修改cron.allow和cron.deny两个文件,来允许出现在cron.allow中的用户拥有crontab权限,而未记录到cron.deny中的用户都可以使用crontab服务,他们的位置分别为:
/etc/cron.allow和/etc/cron.deny
6、定时任务
下面举个定时备份SVN数据的例子,具体如下:
A、sh脚本:
#!/bin/sh
now=`bin/date + %Y%m%d`
/bin/tar czvf "svn_backup_${now}.tar.gz" ./svnbk/ && rm –rf ./svnbk/* && /bin/mv svn_backup_*.tar.gz ./svnbk/
if[$?==0]
then
result=" success"
else
result=" failure"
fi
B、crontab -e
进入vim/vi模式,输入内容:
*/1 * * * * ./crontab_svnbk.sh
7、注意事项
A、配置定时任务时,建议将文件访问都采用绝对路径方式,避免使用相对路径;
B、在shell中,需要添加必要的当前用户环境变量,防止脚本执行时找不到变量;
C、不要直接使用vi编辑/var/spool/cron/下的文件,可能因为输入语法错误,导致无法运行cron服务。
附上:
$man crontab | more
可以在线查看crontab手册
技术讨论群(新):
182437336