Linux的定时任务crond(crontab)服务

1. crond是什么?

Crond是Linux系统中用来定期执行命令或者指定程序任务的以中服务或软件。
一般在我们安装完Centos5/Centos6系统的时候,crond就会默认存在了。
Crond服务默认情况(每分钟),会检查系统中是否有需要执行的定时任务,如果有,就会根据事先定义好的规则来执行这个定时任务。
秒级任务:

  1. crond无能为力
  2. 解决方法:自己写守护进程shell循环

2. 在centos7中写一个简单的秒级定时任务

2.1 在centos7中新建一个文件夹test

centos 定时任务 秒级_配置文件

2.2 在test文件夹下创建一个xxx.sh文件并将以下代码复制进去然后:wq保存
#!/bin/sh
while true
do
  echo 执行了秒级任务
  sleep 1 
done

centos 定时任务 秒级_定时任务_02

2.3 使用sh miao.sh命令启动守护秒级定时任务

centos 定时任务 秒级_配置文件_03


我们可以看到每一秒会执行一次

2.4 有时候我们希望可以把该定时任务放到后台执行并且将执行了秒级任务这句话写入log日志中,将miao.sh中的代码做如下修改

centos 定时任务 秒级_配置文件_04

使用命令 sh miao.sh & 在后台启动该定时任务

centos 定时任务 秒级_定时任务_05

使用命令 ps -ef|grep miao 查看一下是否启动成功

centos 定时任务 秒级_centos 定时任务 秒级_06


可以看到定时任务在后台启动成功

然后我们可以通过命令 tail -f /crond/test/miaio_log.log 来监控该文件的 变化

centos 定时任务 秒级_配置文件_07

2.5 杀掉该定时任务进程
使用命令 kill+进程号

centos 定时任务 秒级_配置文件_08


centos 定时任务 秒级_linux_09


可以看到定时任务进程已经被杀掉了

3.我们来详细学一下linux中的定时任务

3.1 Linux的定时任务分类
  • at:适合执行一次就结束的调度程序,如突发性的任务,了解即可
  • anacron:
    适合于非7*24小时开机的服务器,开机执行的,检测停机期间没有执行的任务,在开机后一次性执行一遍。
  • crond:Crond服务默认情况(每分钟),会检查系统中是否有需要执行的定时任务,如果有,就会根据事先定义好的规则来执行这个定时任务。*****
    提示: 我们说的crond是一个定时任务守护进程,而crontab是用户用来设置定时任务规则的命令
    crontab菜鸟教程
3.2 我们使用crontab -e 来编辑一下定时任务配置看看

centos 定时任务 秒级_linux_10


问题来了,我们到底编辑的是哪个文件呢

键入 vim /var/spool/cron/root

centos 定时任务 秒级_linux_10


说明我们使用crontab -e 编辑定时任务的配置文件,该配置文件就是/var/spool/cron/root 文件

3.3 基本格式如下:
01 * * * * cmd
02 4 * * * cmd
22 4 * * 0 cmd
42 4 1 * * cmd

提示:
  • cmd为要执行的命令或脚本,例如/bin/sh /crond/test/miao.sh
  • 每个列之间必须要有一个空格
  • *号,表示任意时间都
  • -减号,表示分隔符,表示一个时间范围,区间段,如00 17-19 * * * cmd点,每天的17,18,19点00分执行任务
  • , 逗号(英文),表示分割时段的意思,如00 11,13,19 * * * cmd每天的11,18,19点00分执行任务
  • /n n代表数字,即“每隔n单位时间”,例如:每10分钟执行一次任务可以写成*/10 * * * * cmd


含义

取值范围(整数)

第一段

代表分钟

00-59(00也可以是0)

第二段

代表小时

00-23

第三段

代表日,天

01-31

第四段

代表月份

01-12

第五段

代表星期,周几

0-7(0和7都代表星期日)

记忆口诀:分时日月周
3.4来看几个例子
1. 30 3,12 * * * /bin/sh /crond/test/miao.sh
每天凌晨3:30 和中午12:30执行/crond/test/miao.sh脚本
2. 30 */6 * * * /bin/sh /crond/test/miao.sh
每隔6个小时的半点时刻执行脚本
3. 30 8-18/2 * * * /bin/sh /crond/test/miao.sh
早晨8点到下午18点之间每隔2小时的半点时刻执行脚本
4. 30 8-18/2 * * * /bin/sh /crond/test/miao.sh
早晨8点到下午18点之间每隔2小时执行脚本
5. 0,30 18-23 * * * /application/apache/bin/apachectl graceful
每天18:00至23:00之间每隔30分钟重启apache。提示:最后一次执行任务是23:30分
6. * 23,00-07/1 * * * /application/apache/bin/apachectl graceful

强调:周和日尽量不要同时用,否则可能达不到想要的结果,比如:00 12 5 * 1 xxx按照表达式的含义为:每个月周一五号12点半 xxx 这里就矛盾了,每个月的周一并不是五号

4. 写个demo

每分钟将hello world!字符串追加到/hello.log文件中

crontab -e

centos 定时任务 秒级_linux_12


centos 定时任务 秒级_centos 定时任务 秒级_13


切记一定要存在指定目录才会生效,否则就算定时任务配置文件正确结果也出不来 如果想要关闭定时任务crontab -e 在表达式前加#变成注释或者删掉即可

centos 定时任务 秒级_定时任务_14


注意:在修改了crontab -e中的配置文件后保存即可生效,不用重启crond服务

centos 定时任务 秒级_centos 定时任务 秒级_15


注意看下面这个例子:

每天早上6点打印一句话
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。