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’`。