Centos7安装配置crond定时任务详解

crond安装和配置

1.确认是否安装crontab

# crontab -l

如果报 “command not found” ,就说明该crontab服务没有安装

如果报 “no crontab for root” ,就说明已经安装crontab服务了,请跳过步骤一,至于出现这个提示的解决办法请往下看。
2.安装crontab服务

centos系统,请执行以下命令:

//vixie-cron软件包是cron的主程序;  
# yum install -y vixie-cron  

//crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序
# yum install crontabs

//启动服务   
# /sbin/service crond start   或者  systemctl crond start

//查看crond是否开机自动启动:

$ chkconfig --list crond

//设置crond开机自动启动,加入开机自动启动
# chkconfig --level 35 crond on
ubuntu、debian系统,请执行以下命令:

//安装crontab服务  

# apt-get install cron  

//启动crontab服务(同时还有service cron stop 停止服务,service cron restart 重启服务)

# service cron start  

查看crond服务是否运行:
$ ps -ef|grep crond

启动服务命令

命令说明
service crond start启动服务
service crond stop关闭服务
service crond restart重启服务
service crond reload重新载入配置

或者使用systemctl status crond

crontab详解

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。

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

  • crontab任务配置基本格式:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |

# *  *  *  *  * user-name command to be executed

* *  *  *  *  command

分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天)  命令

  • 运行crontab -e 进行配置定时任务
    实例:
* * * * * /home/test.sh #每1分钟执行一次test.sh脚本

*/5 * * * * /home/test.sh #每5分钟执行一次test.sh脚本

30 21 * * * command     #每晚的21:30执行命令

1 1,2 * * * reboot    #其中的1,2代表每天的1点和2点的第一分钟的时候执行reboot命令,中间的逗号表示不同的时间点

1 1-3 * * * reboot    #其中的1-3表示每天的1点到3点的第一分钟的时候执行reboot命令。“-”可以表示一个时间的范围

3,15 * * * * myCommand  #  每小时的第3和第15分钟执行

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

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

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

0 23-7 * * * command    #晚上11点到早上7点之间,执行命令

(1)星号(*)表示所有可用的值。例如在指代month时表示每月执行(需要符合其他限制条件)该命令。
(2)整数间的连字号(-)表示整数列,例如1-4意思是整数1,2,3,4
(3)指定数值由逗号分开。如:3,4,6,8表示这四个指定整数。
(4)符号“/”指定步进设置。“/”表示步进值。如0-59/2定义每两分钟执行一次。步进值也可用星号表示。如
/3用来运行每三个月份运行指定任务。

crontab -e #设置任务示例
0 1 * * * root /data/bakdb.sh >> /data/bak.log 2>&1

每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。

系统级任务调度与用户级任务调度

系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过”crontab –uroot –e”来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。

使用注意事项

crontab不执行的问题分析:

1.当我们手动执行脚本成功而crontab配置定时任务不能执行脚本的时候,很有可能就是执行环境的问题,例如相关路径的设置问题。解决方案:在脚本代码最前面执行 source /home/user/.bash_profile
2.脚本是否有可执行权限。必须保证执行脚本的用户有执行改文件的权限。给文件增加权限:chomd 755 /home/workspace/test/update.sh
3.系统时间不正确。解决方案:date -s ********
4.crond没有启动

注意环境变量问题

有时我们创建了一个crontab,但是这个任务却无法自动执行,而,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

在crontab文件中定义多个调度任务时,需要特别注环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。

不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

1.脚本中涉及文件路径时写全局路径;

2.脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

cat start_cbp.sh
!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &

在脚本中加入source /etc/profile即可解决手动执行可以,定时任务执行脚本,脚本运行出错的问题。

3.当手动执行脚本OK,但是crontab死活不执行时,很可能是环境变量惹的祸,可尝试在crontab中直接引入环境变量解决问题。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

添加定时任务提示权限不够

crontab -e 保存文件后错误提示:/var/spool/cron/tmp.XXXXFSq8E3: 权限不够 crontab: edits left in /tmp/crontab.HaZsu1

解决方法:
进入/var/spool下查看cron目录是正常的,但是在cron里面没有权限建立文件这个根源。
1.可以尝试先在/var/spool/cron目录下用vim编辑一个测试文件,看是否可以保存在这个cron目录下,如果无法保存提示权限问题。
那么可能目录有什么特殊的地方,root用户也被约束了

#进入/var/spool/cron目录
cd /var/spool/cron

#查看是否有特殊的属性
lsattr /var/spool/cron/
 
#去掉特殊的属性,我这里查看没有反应,我就试着清除sia属性
chattr -ai /var/spool/cron

#再次编辑定时任务,试着保存,然后就可以保存了,之后的crontab也可以正常添加,不在报权限问题,也可以查到添加的定时任务。
crontab -e

crontab: installing new crontab

其他应该注意的问题

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值