[Linux之crond计划任务定时任务]

Posted 刘较瘦丫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Linux之crond计划任务定时任务]相关的知识,希望对你有一定的参考价值。

[Linux之crond计划任务、定时任务]

⼀ 定时任务介绍

1、什么是定时任务?

设定某个⽇期或时间周期性执⾏指令。⽐如设定⼀个闹铃,叫你每天早上7点钟起床等,这就是⼀个定时任务。

2、什么是Crond?

Crond是Linux系统中⽤来定期执⾏命令或脚本的⼀种服务软件,⼀般情况下,我们安装完CentOS操作系统之后,默认便会启动Crond任务调度服务。
Crond服务会定期(默认每分钟检查⼀次)检查系统中是否有要执⾏的任务⼯作,如果有,便会根据其预先设定的定时任务规则⾃动执⾏该定时任务⼯作,这个Crond定时任务服务就相当于我们平时早起使⽤的闹钟⼀样。

3、crond⽇志⽂件

/var/log/cron

4、为什么要使⽤定时任务?

定期备份数据,定期执⾏脚本程序
我们举个例⼦说明:例如,我们的数据库或者代码程序需要每天晚上0点做⼀次备份,这样每天夜⾥都需要执⾏的周期性⼯作,如果要让⼈操作的话,就得每天半夜爬起来,然后登录系统执⾏任务,执⾏完接着睡觉。另外,执⾏任务的过程也可能持续⼏个⼩时,这样⼀来,⼀个晚上我们就都不⽤睡觉了,这样显然是不⾏的。那么有什么办法来解决这个周期性的执⾏任务需求呢?
这就是Linux系统的定时任务Crond,这相当于我们平时⽣活中的闹钟功能,每天晚上提前设置定时,早晨按时叫醒你。

5、 定时任务主要分为以下两种使⽤情况。

(1)系统级别的定时任务:

临时⽂件清理例/tmp和/var/tmp等、系统信息采集、⽇志⽂件切割

(2)⽤户级别的定时任务:

定时向互联⽹同步时间、定时备份系统配置⽂件、定时备份数据库的数据

⼆ 定时任务管理

2.1 系统级计划任务

定义⽅式⼀:编辑⽂件/etc/crontab

[root@localhost ~]# vim /etc/crontab
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# 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

# * 分别代表
# 分
# 时
# ⽇
# ⽉
# 周

定义⽅式⼆:把脚本放到该⽬录下

/etc/cron.hourly/ # 系统定时任务每个⼩时运⾏这个⽬录⾥的内容

/etc/cron.daily/ # 系统定时任务每天运⾏这个⽬录⾥的内容

/etc/cron.weekly/ # 系统定时任务每周运⾏这个⽬录⾥的内容

/etc/cron.monthly/ # 系统定时任务每⽉运⾏这个⽬录⾥的内容

2.2 ⽤户级计划任务

[root@localhost ~]# crontab -e # 创建计划任务
* * * * * /bin/ls

[root@localhost ~]# crontab -l # 查看计划任务
* * * * * /bin/ls

[root@localhost ~]# ls /var/spool/cron/
root

[root@localhost ~]# cat /var/spool/cron/root # 都是写在这⾥呢
* * * * * /bin/ls

[root@localhost ~]# tail /var/log/cron # 查看⽇志

[root@localhost ~]# crontab -u egon -e

# /etc/cron.deny 是定时任务的⿊名单,使⽤root将需要拒绝的⽤户加⼊/etc/cron.deny

[root@localhost ~]# echo "egon" >> /etc/cron.deny

[root@localhost ~]# su - egon # 登陆该普通⽤户,⽆法编写定时任务

上⼀次登录:四 8⽉ 13 19:44:10 CST 2020pts/1 上 [egon@localhost ~]$ crontab -e

You (egon) are not allowed to use this program (crontab)
See crontab(1) for more information

2.3 计划任务语法格式

注意:crond是按照分钟进⾏计算的,不⽀持秒

  * 表示任意的(分、时、⽇、⽉、周)时间都执⾏

  - 表示⼀个时间范围段, 如5-7点

  , 表示分隔时段, 如6,0,4表示周六、⽇、四

  /1 表示每隔n单位时间, 如*/10  就是每10分钟

了解定时任务crontab的编写规范。

00 02 * * * #每天的凌晨2点整执⾏

00 02 1 * * #每⽉的1⽇的凌晨2点整执⾏

00 02 14 2 * #每年的2⽉14⽇凌晨2点执⾏

00 02 * * 7 #每周天的凌晨2点整执⾏

00 02 * 6 5 #每年的6⽉周五凌晨2点执⾏

00 02 14 * 7 #每⽉14⽇或每周⽇的凌晨2点都执⾏

00 02 14 2 7 #每年的2⽉14⽇或每年2⽉的周天的凌晨2点执⾏

*/10 02 * * * #每天凌晨2点,每隔10分钟执⾏⼀次

* * * * * #每分钟都执⾏

00 00 14 2 * #每年2⽉14⽇的凌晨执⾏命令

*/5 * * * * #每隔5分钟执⾏⼀次

00 02 * 1,5,8 * #每年的1⽉5⽉8⽉凌晨2点执⾏

00 02 1-8 * * #每⽉1号到8号凌晨2点执⾏

00 21 * * * #每天晚上21:00执⾏

45 4 1,10,22 * * #每⽉1、10、22⽇的4:45执⾏

45 4 1-10 * * #每⽉1到10⽇的4:45执⾏

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

0 23-7/2 * * * #晚上11点到早上7点之间,每隔两⼩时执⾏

15 21 * * 1-5 #周⼀到周五每天晚上21:15执⾏

crontab不执⾏的问题

第⼀,脚本的原因:⼤多数情况下,我们要相信科学,相信计算机,不是有⻤,就是我们的脚本的问题,这种问题导致crontab不能执⾏的概率占到 70%以上。因为程序执⾏到某⼀步导致crontab终⽌执⾏,我就碰到⼀次在迁移代码的时候将数据库连错了。导致⽆法访问⽽死在那⾥了。


第⼆,执⾏环境问题,当我们碰到第⼀情况下,⼀般都可以通过⼿动执⾏程序将问题扼杀在摇篮⾥,⼀般情况下⾼⼿是不应该犯第⼀种错误的。问题是当我们 ⼿动执⾏成功⽽crontab不能执⾏的时候,笔者碰到⼀次就是执⾏环境的问题,例如相关路径的设置问题。解决⽅案:在代码最前⾯执⾏ source/home/user/.bash_profile


第三,系统时间不正确。这种问题最好理解,也是⽐较常⻅和隐蔽的问题,解决⽅案:date -s ********


第四,就是我们的脚本是否有可执⾏权限。必须保证执⾏脚本的⽤户有执⾏改⽂件的权限。


第五,crontab 守护进程死掉了。这种情况是极少发⽣的,但也不排除,当我们实在是找不到其他原因的时候可以⽤。解决⽅案:重启该进程。


第六,crontab不执⾏的问题困扰了好⻓时间,脚本写的都正确,但是就是不执⾏,最终解决⽅法如下:
crontab -u root /var/spool/cron/root这样root⽤户的crontab就⽣效了
[root@localhost ~]# systemctl restart crond
重启下服务就好了


第七,crond没有启动


第⼋,脚本编码问题,脚本在window下编写,传到linux下后报“锘?!/bin/bash”,⽤vi编辑器新建shell
脚本,输⼊内容后保存。


第九* * * * * tar czf /tmp/`date \'+%Y\'` /etc 该计划任务中命令的执⾏流程是crond->tar命令,⽽crond在执⾏tar命令时,⽆法识别通配符%的意思(shell能识别),所以该命令⽆法正常执⾏改正结果:* * * * * tar czf /tmp/`date \'+\\%Y\'` /etc通常都会把要执⾏的操作放到⽂件中,然后/bin/bash a.sh去执⾏,* * * * * /bin/bash a.sh ,这样的执⾏流程就变成了crond->bash shell->a.sh,这样a.sh内即便是写%号,也能被识别出来

四、定时发邮件

定时发邮件点我

总结:9句箴⾔

1.定时任务规则之前加注释

2.使⽤脚本执⾏定时任务(只有⼀条简单命令的可以直接使⽤命令执⾏)

3.运⾏脚本⼀定要⽤绝对路径执⾏,统⼀脚本位置。

4.定时任务中date命令的百分号需转义才能使⽤。

5.命令或脚本结果(正确及错误)定向到空(>/dev/null 2>&1)或追加到⽂件中 >>/tmp/oldboy.txt 2>&1

6.避免不必要的程序及命令输出,如打包命令,tar -v的显示过程的选项。

7.打包压缩使⽤相对路径(切到⽬标⽬录的上⼀级打包⽬标)

8.定时任务脚本中的程序⽂件 ,尽量⽤绝对路径,⽤户的定时任务中的⽂件默认存放在当前⽤户的家⽬录

9.系统与命令位置有关的环境变量问题,建议脚本中重新定义环境变量PATH。

以上是关于[Linux之crond计划任务定时任务]的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统之crond

linux命令之crontab定时执行任务

linux命令之crontab定时执行任务

Linux计划任务 定时任务 Crond 配置详解 crond计划任务调试 sh -x 详解 JAVA脚本环境变量定义

定时任务之crond服务

linux中的crondtab定时计划任务