crontab命令参数说明
crontab [-u username] [-l|-e|-r]
选项与参数:
-u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
-e :编辑 crontab 的工作内容
-l :查阅 crontab 的工作内容
-r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑
crontab命令格式说明
- 时间格式如下:
f1 f2 f3 f4 f5 program
- 其中f1是表示分钟,f2是表示小时,f3是表示一个月份中的第几日,f4表示月份,f5表示一个星期中的第几天。
- 当f1表示*时表示每分钟都要执行program,f2为*时表示每小时都要执行程序,以此类推。
- 当f1表示a-b时表示从第a分钟到第b分钟这段时间内要执行,f2为a-b时表示从第a到第b小时都要执行,以此类推。
- 当f1为*/n时表示每n分钟个时间间隔执行一次,f2为*/n表示每n小时个时间间隔执行一次,以此类推。
- 当f1为a,b,c,…时表示第a,b,c,…分钟要执行,f2为a,b,c,…时表示第a,b,c,…个小时要执行,以此类推。
每项工作(每行)的格式都是具有六个栏位,六个栏位的意义为
代表意义 | 分钟 | 小时 | 日期(天) | 月份 | 周 | 命令 |
---|---|---|---|---|---|---|
数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 | 命令 |
特殊字符 | 代表意义 |
---|---|
* | 代表任何时刻都可以 |
. | 代表分隔时段 |
- | 代表一段时间范围 |
/n | n代表数字,即是每隔n单位间隔 |
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
举例说明
43 21 * * * 21:43 执行
15 05 * * * 05:15 执行
0 17 * * * 17:00 执行
0 17 * * 1 每周一的 17:00 执行
0,10 17 * * 0,2,3 每周日,周二,周三的 17:00和 17:10 执行
0-10 17 1 * * 毎月1日从 17:00到17:10 毎隔1分钟 执行
0 0 1,15 * 1 毎月1日和15日和周一的 0:00 执行
42 4 1 * * 毎月1日的 4:42分 执行
0 21 * * 1-6 周一到周六 21:00 执行
0,10,20,30,40,50 * * * * 每隔10分 执行
*/10 * * * * 每隔10分 执行
* 1 * * * 从1:0到1:59 每隔1分钟 执行
0 1 * * * 1:00 执行
0 */1 * * * 毎时0分 每隔1小时 执行
0 * * * * 毎时0分 每隔1小时 执行
2 8-20/3 * * * 8:02,11:02,14:02,17:02,20:02 执行
30 5 1,15 * * 1日和15日的 5:30 执行
注意:周与日月不可同时并存
『你可以分别以周或者是日月为单位作为循环,但你不可使用「几月几号且为星期几」的模式工作』。
crontab的日志路径
# 【日志是按照天排列的】
[wqf@b1i10 ~]$ ll /var/log/cron*
-rwxrwxr-x 1 root root 1354975 Apr 25 18:20 /var/log/cron
-rwxrwxr-x 1 root root 3323417 Apr 2 03:21 /var/log/cron-20230402
-rwxrwxr-x 1 root root 3516278 Apr 9 03:43 /var/log/cron-20230409
-rwxrwxr-x 1 root root 3671741 Apr 16 03:37 /var/log/cron-20230416
-rwxrwxr-x 1 root root 3671864 Apr 23 03:47 /var/log/cron-20230423
/var/log/cron只会记录是否执行了某些计划的脚本,但是具体执行是否正确以及脚本执行过程中的一些信息则linux会每次都发邮件到该用户下。
crontab的注意事项
1.注意环境变量问题
crontab不能识别Java的环境变量
如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。
解决方法:
-
1、脚本中涉及所有文件路径需要写成绝对路径形式,如: /usr/local/bin/docker。
-
2、在 shell 脚本开头使用以下代码:
#!/bin/sh
. /etc/profile
或者
source /etc/profile ##此文件为系统的每个用户设置环境信息。source在当前bash环境下执行命令。
. ~/.bash_profile ##在登录时用到的第三个文件是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次,默认情况下,设置一些环境变量,执行用户的.bashrc文件。
或者
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev & ##设置环境变量
- 3、在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:
20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh
总结:crontab执行shell时,只能识别为数不多的环境变量,普通的环境变量是无法识别的,所以在编写shell时,最好使用export重新声明变量,确保脚本执行。
2.系统任务调度与用户任务调度
root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。
3.其他注意事项
1、时间变量:在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的 date “+%Y%m%d”,在crontab里是不会执行的,应该换成date “+%Y%m%d”
解决方法:
## date "+%Y%m%d"在crontab不执行
59 8-23 * * * nohup sh /apps/summary_fz_province/cdc_model/bin/m568_model_2/m568_model2.sh > /apps/summary_fz_province/cdc_model/log/m568_model_2/m568_model_$(date "+%Y%m%d%H").log 2>&1 &
## 换成date "+\%Y\%m\%d"
59 8-23 * * * nohup sh /apps/summary_fz_province/cdc_model/bin/m568_model_2/m568_model2.sh > /apps/summary_fz_province/cdc_model/log/m568_model_2/m568_model_$(date "+\%Y\%m\%d\%H").log 2>&1 &
2、当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
3、千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
4、记得给定时任务添加注释