首先有必要了解一下linux或者UNIX系统中的
crontab
命令,这个命令是
用于设置周期性执行的指令
。该命令从标准输入设备读取指令,并将其存放在"crontab"这个文件中,以供之后读取和执行。
通常,crontab存储的指令被守护进程激活。
crond是linux下的用来周期性地执行某项任务或等待某个事件的守护进程,与windows下的计划任务类似。当安装操作系统时会默认安装这个服务工具,并且会启动crond进程。
crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron job。
linux下的任务调度分为两类:系统任务调度和用户任务调度。
系统任务调度就是系统周期性要执行的任务,如写缓存数据到磁盘,清理日志等。
在/etc目录下有个crontab文件,这个文件就是系统任务调度的配置文件,来看看其中的内容:
[
oracle@oracle etc]$ cat crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前面四行指定了用来配置crond任务的环境变量。shell指定系统要使用哪个shell,这里是bash。
第二行指定了系统执行命令的路径。第三行的mailto指定了crond执行任务的信息将通过电子邮件发送给root用户,如果为空就表示不会发送执行任务信息给用户。最后一行指定了在执行命令或者脚本时使用的目录。
用户任务调度:
用户定期要执行的任务,比如说数据备份,定期邮件提醒等。用户可以通过crontab这个工具来制定计划任务,所有用户定义的crontab文件都会被存放在
/var/spool/cron目录中,其文件名和用户名相同。
说明下各个文件的作用:
/etc/cron.deny 这个文件中列出的用户是无法使用crontab命令的。
/etc/cron.allow 这个文件中列出的用户是允许使用crontab命令的。
/var/spool/cron 所有用户crontab文件存放的目录。
下面开始讲讲crontab命令的使用:
用户所创建的crontab文件中每一行都表示一项任务,每一行都有6个字段,每个字段都表示不同的设置,前面5个字段是设置时间的,第6个字段是要执行的命令(可以是系统命令,也可以是自己编写的脚本),其格式是:
minute hour day month week command
如下所示:
![](http://img.blog.itpub.net/blog/attachment/201410/29/29800581_1414595025G4YG.png?x-oss-process=style/bb)
在以上字段中可以使用如下特殊字符:
星号(*):代表所有可能的值,比如在month字段中使用“*",表示在满足其他字段的制约条件后每个月都执行该命令。
逗号(,):可以在一个字段中使用逗号隔开值来表示一个范围,如“1,2,3,4,5,6,”。
横杠(-):同样在一个字段中使用来表示一个范围,如"1-6"表示“1,2,3,4,5,6”。
斜线(/):可以使用斜线来指定时间的间隔频率,如“
0-23/2”表示每两个小时执行一次。同时斜线可以和星号使用,如果在minute字段中有
*/10,表示每十分钟执行一次。
crond服务操作说明:
启动服务:/sbin/service crond start
停止服务:/sbin/service crond stop
重启服务:/sbin/servie crond restart
重新载入配置:/sbin/service crond reload
查看crond服务状态:/sbin/service crond status
在考虑向crond进程提交一个crontab文件之前,首先要做的是设置一个环境变量,EDITOR。crond进程用它来确定使用哪个编辑器,大部分都是使用vi编辑器,那么就到相应用户的.bash_profile中加入一行:
export EDITOR=vi
存盘退出并使用source使其立即生效。
例子:
在/home/huan目录下创建一个名为cronz的文本:
*/2 * * * * echo "hello" >>test.txt(注意是>>)
意思是每隔两分钟就向test.txt文本写入"hello"。
然后执行crontab filename:
[
huan@oracle ~]$ crontab cronz
验证crontab文件是否真的生成了:到/var/spool/cron目录下查看以用户名为名称的文本是否生成,并查看其中的内容:
查看test.txt,发现每隔两分钟就会写入"hello":
实例:
1.每分钟执行一次command:
1.每分钟执行一次command:
* * * * * command
2.每小时的第3和第15分钟执行:
3,15 * * * * command
3.在上午8点到11点的第3和第15分钟执行:
3,15 8-11 * * * command
4.每隔两天的上午8点到11点的第3和第15分钟执行:
3,15 8-11 */2 * * command
5.每个星期一上午8点到11点的第3和第15分钟执行:
3,15 8-11 * * 1
6.每晚的21:30重启smb:
30 21 * * * /etc/init.d/smb restart
7.每月1,10,22日的4:45重启smb:
45 4 1,10,22 * * /etc/init.d/smb restart
8.每周六周日的1:10重启smb:
10 1 * * 6,0 /etc/init.d/smb restart
9.每天18:00至23:00之间每隔30分钟重启smb:
0,30 18-23 * * * /etc/init.d/smb restart
0,30 18-23 * * * /etc/init.d/smb restart
10.每个星期六晚上11:00pm重启smb:
0 23 * * 6 /etc/init.d/smb restart
11.每一小时重启smb:
* */1 * * * /etc/init.d/smb restart
12.晚上11点到早上7点之间,每隔一小时重启smb:
* 23-7/1 * * * /etc/init.d/smb restart
13.每月的4号与每周一到周三的11点重启smb:
0 11 4 * mon-wed /etc/init.d/smb restart
0 11 4 * mon-wed /etc/init.d/smb restart
14.一月一号的4点重启smb:
0 4 1 jan * /etc/init.d/smb restart
15.每小时执行/etc/cron.hourly目录内的脚本:
* */1 * * * root run-parts /etc/cron.hourly
16.每个周二,周四,周六零时30分的时候执行脚本rman.sh:
30 00 * * 2,4,6 /home/oracle/backup_script/rman.sh
17.每天零时30分的时候执行脚本rman.sh:
30 00 * * * /home/oracle/backup_script/rman.sh
如下,想每隔一分钟输出时间到test.txt文件中:
[
oracle@oracle cronoracle]$ crontab crontime
[ oracle@oracle cronoracle]$ crontab -l
*/1 * * * * date >> /home/oracle/test.txt
[ oracle@oracle cronoracle]$ crontab -l
*/1 * * * * date >> /home/oracle/test.txt
[
oracle@oracle cronoracle]$ tail -f /home/oracle/test.txt
Wed Oct 29 07:57:01 PDT 2014
Wed Oct 29 07:58:01 PDT 2014
Wed Oct 29 07:57:01 PDT 2014
Wed Oct 29 07:58:01 PDT 2014
Wed Oct 29 07:59:01 PDT 2014
下面给出一个自动执行备份的脚本例子:
[
oracle@oracle scripts]$ more rman.sh
#!/bin/bash
export ORACLE_SID=orcl
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$HOME/bin:$PATH
rman target / > /u01/app/backup/autorman/log/rman_backup_`date "+%Y-%m-%d"`.log << EOF
run{
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/u01/app/backup/autorman/dbfull_%d_%s';
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/app/backup/autorman/ctl_%F';
backup format='/u01/app/backup/autorman/dbfull_%d_%s' database plus archivelog delete input;
sql 'alter system switch logfile';
}
quit
EOF
#!/bin/bash
export ORACLE_SID=orcl
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$HOME/bin:$PATH
rman target / > /u01/app/backup/autorman/log/rman_backup_`date "+%Y-%m-%d"`.log << EOF
run{
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/u01/app/backup/autorman/dbfull_%d_%s';
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/app/backup/autorman/ctl_%F';
backup format='/u01/app/backup/autorman/dbfull_%d_%s' database plus archivelog delete input;
sql 'alter system switch logfile';
}
quit
EOF
[
oracle@oracle cronrman]$ crontab -l
30 0 * * * /scripts/rman.sh
30 0 * * * /scripts/rman.sh
每天零时30分执行一次/scripts/rman.sh备份脚本。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29800581/viewspace-1313947/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29800581/viewspace-1313947/