【linux】crontab命令使用


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:0017:10 执行
0-10 17 1 * *      毎月1日从 17:0017: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:01: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、记得给定时任务添加注释

猜你喜欢

转载自blog.csdn.net/sodaloveer/article/details/130368383