crontab基本用法及常见问题定位

本文主要介绍crontab的基本用法及常见问题定位。


一、crontab的基本用法

我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。
/var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
/etc/crontab 这个文件负责调度各种管理和维护任务。
/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
我们还可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次

使用者权限文件:

文件:/etc/cron.deny
说明:
该文件中所列用户不允许使用crontab命令
文件:/etc/cron.allow
说明:
该文件中所列用户允许使用crontab命令
文件:/var/spool/cron/
说明:
所有用户crontab文件存放的目录,以用户名命名

crontab的文件格式

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
其中:
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

crontab的两种配置方式

第一种:在/etc/crontab下设置,指定用户名的
1、vim命令进入/etc/crontab
2、在最后一行加上
59 23 * root /root/catalina.out.rm/rm_8080_8081_catalina.sh
如下图:

3、重启crontab,使配置生效

第二种:直接用crontab -e,不需要指定用户
1、crontab -e进入

2、:wq退出保存
3、查看上面那个脚本是否有执行权限

4、还要看脚本里面的涉及的操作文件是否有权限
5、重启crontab,使配置生效

crontab命令参数:
    -u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
    -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
    -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
    -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
    -i:在删除用户的crontab文件时给确认提示。

二、使用实例

实例1:每1分钟执行一次myCommand

1
* * * * * myCommand

实例2:每小时的第3和第15分钟执行
1
3,15 * * * * myCommand

实例3:在上午8点到11点的第3和第15分钟执行
1
3,15 8-11 * * * myCommand

实例4:每隔两天的上午8点到11点的第3和第15分钟执行
1
3,15 8-11 */2  *  * myCommand

实例5:每周一上午8点到11点的第3和第15分钟执行
1
3,15 8-11 * * 1 myCommand

实例6:每晚的21:30重启smb
1
30 21 * * * /etc/init.d/smb restart

实例7:每月1、10、22日的4 : 45重启smb
1
45 4 1,10,22 * * /etc/init.d/smb restart

实例8:每周六、周日的1 : 10重启smb
1
10 1 * * 6,0 /etc/init.d/smb restart

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
1
0,30 18-23 * * * /etc/init.d/smb restart

实例10:每星期六的晚上11 : 00 pm重启smb
1
0 23 * * 6 /etc/init.d/smb restart

实例11:每一小时重启smb
1
* */1 * * * /etc/init.d/smb restart

实例12:晚上11点到早上7点之间,每隔一小时重启smb
1
0 23-7 * * * /etc/init.d/smb restart

三、crontab常见问题定位

crontab日志:/var/log/cron
crontab与环境变量:

常见问题1: 单独在命令行执行就没有问题,放到crontab 任务没有反应!!!
不要假定cron知道所需要的特殊环境,它其实并不知道。
bash 的用户环境,是当用户在登录的时候,bash 读取多个配置文件(/etc/profile, ~/.bash_profile, ~/.bashrc …),从而为我们设定了很多环境变量。
但是,cron 不同,它并不知道用户的环境,所以你要保证在shell脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。
那么问题来了: crontab 任务没有反应!!! 单独在命令行执行就没有问题,放到crontab中就不行!!! 典型的问题,根据经验,这就是crontab的环境变量跟用户的环境变量不同导致的。

常见问题2:路径问题
其实路径是个非常容易出问题的地方,假设在/home/目录下有一个脚本文件test1.sh,然后在该目录下还有一个脚本文件test2.sh

在test1.sh中执行了test2.sh,而且用的是相对路径,即相对test1.sh所在的路径。

如果在crontab -e中编辑的时候,执行的方式是
sh /home/test1.sh,当执行到调用sh test2.sh的时候,系统会认为是从crontab文件所在的目录去找test2.sh,但是其实是找不到的,造成执行失败

所以另外一个解决方法就是在执行脚本之前先通过 cd /home/命令进入到脚本所在目录

总结
注意如下几点:

  • 脚本中涉及文件路径时全部写绝对路径;
  • crontab中涉及路径时全部写绝对路径
  • 脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
    $ cat start_cbp.sh

    1
    2
    3
    4
    #!/bin/bash
    source /etc/profile # 引入 profile环境变量
    export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
    /usr/local/jboss-4.0.5/bin/run.sh -c mev &
  • 当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

    1
    0 * * * * . /etc/profile; /bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
  • 新创建的cron job,可能不会马上执行,至少要过2分钟才执行。如果需要,请重启crond这个服务。
  • 每条 JOB 执行完毕之后,如果有输出,那么系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。
  • 当crontab突然失效时,可以尝试 /etc/init.d/crond restart 解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
  • 千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab 记录都没了。
  • 在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’`。
  • 工作中遇到比较多的是root密码过期,导致它的cronjob无法正常执行。
  • 周与日月不可同时并存。 要么指定周, 要么指定日月

其他不执行的原因可以参考:crontab定时任务不执行的原因


参考资料

Linux配置定时,使用 crontab -e 与 直接编辑 /etc/crontab 的区别
Linux基础:crontab 与 环境变量,以及应该注意的问题
crontab的两种配置方式
crontab定时任务不执行的原因
crontab与环境变量,以及应该注意的一些问题

如果你觉得本文对你有帮助,欢迎打赏