基本格式 :
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab -l //列出自己的所有cron任务
crontab -r //删除自己的所有cron任务
crontab -e //编辑自己的cron任务
除了数字还有几个特殊的符号就是:
*代表所有的取值范围内的数字,”/”代表每的意思,”*/5″表示每5个单位,”-”代表从某个数字到某个数字,”,”分开几个离散的数字。以下举几个例子说明问题:
每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
每2分钟执行1次
*/2 * * * * echo "Have a break now." >> /tmp/test.txt
晚上11点到早上7点之间每两个小时,早上八点
0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 echo "Have a good dream:)" >> /tmp/test.txt
1月1日早上4点
0 4 1 1 * echo "Have a good dream:)" >> /tmp/test.txt
30 21 * * * 表示每晚的21:30 做什么
45 4 1,10,22 * * 表示每月1、10、22日的4:45 做什么
10 1 * * 6,0 表示每周六、周日的1:10 做什么
0,30 18-23 * * * 表示在每天18:00至23:00之间每隔30分钟 做什么
0 23 * * 6 表示每星期六的23:00 做什么
* */1 * * * 表示每一小时 做什么
* 23-7/1 * * * 晚上11点到早上7点之间,每隔一小时 做什么
0 11 4 * mon-wed 每月的4号与每周一到周三的11点 做什么
0 4 1 jan * 一月一号的4点 做什么
0 7 * * * 每天早上7点执行一次
0 6-12/3 * 12 * 在12月内, 每天的早上6点到12点中,每隔3个小时执行一次
0 17 * * 1-5 周一到周五每天下午 5:00
20 0-23/2 * * * 每月每天的午夜 0点20分,2点20分,4点20 分....执行
10 6 * * * 每天早上6点10分
0 */2 * * * 每两个小时
0 23-7/2,8 * * * 晚上11点到早上8点之间每两个小时,早上8点
0 11 4 * mon-wed 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 4 1 jan * 一月一号的4点重启apache
0 */2 * * * 每两个小时
50 7 * * * 每天7:50
50 22 * * * 每天22:50
0 0 1,15 * * 每月1号和15号
1 * * * * 每小时的第1分钟
00 03 * * 1-5 每周一至周五3点钟
30 6 */10 * * 每月的1、11、21、31日是的6:30
【调用oracle存储过程例子】
grant create procedure to scott;
1、创建表
create table test(current_time date);
2、创建存储过程
CREATE OR REPLACE PROCEDURE p_insert_test as
begin
begin
insert into test values (sysdate);
commit;
end;
end p_insert_test;
/
3、编写shell脚本调用存储过程
vi /home/oracle/p_insert_test.sh
#!/bin/sh
export ORACLE_HOME=/oracle/app/oracle/product/10.2.0/db_1
export NLS_LANG=american_america.ZHS16GBK
PATH=$ORACLE_HOME/bin:$PATH
export PATH
ORACLE_SID=ecom
export ORACLE_SID
source /home/oracle/.bash_profile
DATE="`date +%Y-%m-%d`"
ORA_BIN="/oracle/app/oracle/product/10.2.0/db_1/bin"
${ORA_BIN}/sqlplus scott/lipengfei << EOF >/home/oracle/p_insert_test_${DATE}.log
set timing on;
set serveroutput on size 100000;
prompt "call p_insert_test"
call p_insert_test();
commit;
EXIT
EOF
4、给脚本执行权限
chmod +x /home/oracle/p_insert_test.sh
5、加入定时任务
crontab -e
*/1 * * * * sh /home/oracle/p_insert_test.sh【每1分钟执行一次】
【检测结果】
select to_char(current_time,'yyyy-mm-dd hh24:mi:ss') from test;
----------------------------------------------------
一、创建dbms_job
(1)
DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X
,what => 'p_insert_test;'
,next_date => to_date( '03-03-2016 11:09:00 ', 'dd-mm-yyyy hh24:mi:ss ')
,interval => 'trunc(sysdate,''mi'')+1/(60*24)'
,no_parse => FALSE
);
COMMIT;
END;
/
(2)
variable v_job number;
begin
dbms_job.submit(:v_job,'p_insert_test;',sysdate,'SYSDATE + 1/(60*24)');
end;
/
commit;
二、查看dbms_job
select job,SCHEMA_USER,LOG_USER,THIS_DATE,WHAT,LAST_DATE,NEXT_DATE from user_jobs;【查看当前用户自己的dbms_job】
select JOB,
LOG_USER,
PRIV_USER,
SCHEMA_USER,
LAST_DATE,
LAST_SEC,
THIS_DATE,
THIS_SEC,
NEXT_DATE,
NEXT_SEC,
TOTAL_TIME,
INTERVAL,
WHAT INSTANCE
from dba_jobs; 【查看所有的dbms_job】
字段(列) 类型 描述
JOB NUMBER 任务的唯一标示号
LOG_USER VARCHAR2(30) 提交任务的用户
PRIV_USER VARCHAR2(30) 赋予任务权限的用户
SCHEMA_USER VARCHAR2(30) 对任务作语法分析的用户模式
LAST_DATE DATE 最后一次成功运行任务的时间
LAST_SEC VARCHAR2(8) 如HH24:MM:SS格式的last_date日期的小时,分钟和秒
THIS_DATE DATE 正在运行任务的开始时间,如果没有运行任务则为null
THIS_SEC VARCHAR2(8) 如HH24:MM:SS格式的this_date日期的小时,分钟和秒
NEXT_DATE DATE 下一次定时运行任务的时间
NEXT_SEC VARCHAR2(8) 如HH24:MM:SS格式的next_date日期的小时,分钟和秒
TOTAL_TIME NUMBER 该任务运行所需要的总时间,单位为秒
BROKEN VARCHAR2(1) 标志参数,Y标示任务中断,以后不会运行
INTERVAL VARCHAR2(200) 用于计算下一运行时间的表达式
FAILURES NUMBER 任务运行连续没有成功的次数
WHAT VARCHAR2(2000) 执行任务的PL/SQL块
CURRENT_SESSION_LABEL RAW MLSLABEL 该任务的信任Oracle会话符
CLEARANCE_HI RAW MLSLABEL 该任务可信任的Oracle最大间隙
CLEARANCE_LO RAW MLSLABEL 该任务可信任的Oracle最小间隙
NLS_ENV VARCHAR2(2000) 任务运行的NLS会话设置
MISC_ENV RAW(32) 任务运行的其他一些会话参数
*/
三、删除dbms_job【只有创建的dbms_job的owner能删除自己的dbms_job,其它不可以,DBA用色也不行】
begin
dbms_job.remove(dbms_job号);
end;
/
begin
dbms_job.remove(1);
end;
/
四、杀掉正运行的dbms_job
1、使用创建dbms_job的用户,标识Job被破坏了
begin
EXEC DBMS_JOB.BROKEN(dbms_job号,TRUE);
end;
/
注意:当执行完该命令你选择的这个JOB还是在运行着的。
2、上面的Job虽然被标识破坏了,但是正在执行的job还会正常跑完
select sid from dba_jobs_running where job=第1号的job号;
select sid,serial# from v$session where sid=sid;
3. Kill 对应的Oracle Session
应为BROKEN后该JOB还在运行,如果要求该JOB立刻停止,然后执行以下命令:
ALTER SYSTEM KILL SESSION 'sid,serial#';
五、执行频率【INTERVAL参数值】
每天午夜12点 TRUNC(SYSDATE + 1)
每天早上8点30分 TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)
每星期二中午12点 NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24
每个月第一天的午夜12点 TRUNC(LAST_DAY(SYSDATE ) + 1)
每个季度最后一天的晚上11点 TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24
每星期六和日早上6点10分 TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)
每秒钟执行次 sysdate + 1/(24 * 60 * 60)
每10秒钟执行次
sysdate + 10/(24 * 60 * 60)
每分钟执行 TRUNC(sysdate,'mi') + 1/ (24*60)
每10分钟执行次 TRUNC(sysdate,'mi') + 10/ (24*60)
每天的凌晨1点执行 TRUNC(sysdate) + 1 +1/ (24)
每周一凌晨1点执行 TRUNC(next_day(sysdate,'星期一'))+1/24
每月1日凌晨1点执行 TRUNC(LAST_DAY(SYSDATE))+1+1/24
每季度的第一天凌晨1点执行 TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
每年7月1日和1月1日凌晨1点 ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
每年1月1日凌晨1点执行 (trunc(sysdate,'yyyy'),12)+1/24
每隔一星期运行一次 sysdate+7
每天运行一次
sysdate+1
每小时运行一次
sysdate+1/24
每10分钟运行一次 sysdate+10/(60*24)
每30秒运行一次
sysdate+30/(60*24*60)
每天午夜12点
trunc(sysdate+1)
每天早上8点30分
trunc(sysdate+1) +(8*60+30)/(24*60)
每个月第一天的午夜12点
trunc(last_day(sysdate)+1)
每个季度最后一天的晚上11点
trunc(add_months(sysdate+2/24,3),′Q′)-1/24
每个月最后一天运行一次 TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,1))) + 23/24
每年1月1号零时 TRUNC(LAST_DAY(TO_DATE(EXTRACT(YEAR from SYSDATE)||'12'||'01','YYYY-MM-DD'))+1)
每天午夜12点 TRUNC(SYSDATE + 1)
每天早上8点30分 TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)
每个月第一天的午夜12点 TRUNC(LAST_DAY(SYSDATE ) + 1)
每个月最后一天的23点 TRUNC (LAST_DAY (SYSDATE)) + 23 / 24
每个季度最后一天的晚上11点 TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24
当前月初1号 trunc(sysdate,'mm')
下个月月初1号 add_months(trunc(sysdate,'mm'),1)
下个月20号3点
trunc(add_months(sysdate,1),'mm')+19 + 3/24
下下个月20号3点 trunc(add_months(sysdate,2),'mm')+19 + 3/24