已整理-Linux定时任务服务crond

 

目录:

  1、Linux 计划任务概述(系统任务与用户任务)

  2、系统任务配置文件描述

  3、用户任务概述

  4、crontab配置格式

  5、查看所有用户的crontab任务

  6、如何实现秒级的任务?

 

 

1、Linux 计划任务概述(系统任务与用户任务)
Linux的任务调度主要分为两类:

系统任务调度:系统周期性所要执行的工作,比如系统数据备份、临时文件清理、缓存清理等。

用户任务调度:某个用户定期要执行的工作,比如用户数据备份、定时邮件提醒等,这些工作可由每个用户自行设置。

 

系统任务调度在:/etc/crontab 或在 /etc/cron.d/ 目录下载编写:

# ll /etc/cron.d/0hourly 
-rw-r--r-- 1 root root 128 Jan 14 00:52 /etc/cron.d/0hourly

# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly

 

用户任务调度:使用crontab命令来编写,写完后,存放在:/var/spool/cron/

cron服务进程(crond是cron的守护进程)每1分钟去读取这些文件:
【1】系统任务:/etc/crontab 文件 和 /etc/cron.d/ 目录
【2】用户任务: /var/spool/cron/ 目录


2、系统任务配置文件描述
/etc/cron.d/是一个目录,也由root维护。这个目录下可以存放多个crontab任务文件,这样我们就可以以文件的粒度对不同类别的任务调度进行管理了。
/etc/cron.d/目录下的任务调度文件需要遵循以下命名规范才能被cron服务正确扫描:
只能包含字母、数字、下划线和中划线(尤其注意不能包含 . )
/etc/crontab 作用与/etc/cron.d/ 一致,但一般不会在/etc/crontab文件中写。

# cat /etc/cron.d/0hourly 
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly        #每小时的01分钟去执行一遍:/etc/cron.hourly目录下所有的脚本

# ll /etc/cron.hourly/                    #/etc/cron.hourly/ 目录下面的脚本具有可执行权限
-rwxr-xr-x 1 root root 392 Jan 14 00:52 0anacron

其中:通过run-parts命令来执行某个目录下的所有可执行脚本文件

 

/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly 这些是什么?
系统预设了这四个目录,用来放置【每小时、每天、每周、每月】要执行的可执行脚本文件;
注意:这四个目录只是预设,并没有完全启用,并不是直接将可执行脚本文件放入其中就可以,还需要run-parts命令的配合。
我所使用的centos 7.2中,就只有 /etc/cron.hourly 这一个目录作为系统样例被启用了(配置在了/etc/cron.d/目录下的 0hourly 文件中)。

系统任务不会出现在:/var/spool/cron/ 目录中!

 

通过/etc/cron.allow与/etc/cron.deny两个文件来控制哪个用户有权使用crontab。

这两个文件的内容与格式很简单,将需要配置的用户名写入文件,每个用户名占一行。
由于cron.allow与cron.deny同时存在的情况下,cron.deny没有实际意义。因此从逻辑、语义清晰的角度出发,不建议同时保留两个文件。根据实际需求,白名单与黑名单保留一个就好。

 

3、用户任务概述
用途:按照设置的时间间隔为用户反复执行某一项固定的系统任务;

软件包: cronie/crontabs
系统服务:crond
日志文件:/var/log/crond    #非常重要,可用于排错

使用crontab 命令编写:

crontab -e [-u 用户名]    #编辑
crontab -l [-u 用户名]    #查看
crontab -r [-u 用户名]    #清除

 

4、crontab配置格式

分    时    日    月    周    任务命令行(绝对路径)            #需要顶格写!!!!

分钟:从0-59之间的整数

小时:从0-23之间的整数

日期:从1-31之间的整数

月份:从1-12之间的整数

星期:0-7之间的整数,0或7代表星期日

【*】: 匹配范围内任意时间
【,】: 分隔多个不连续的时间点
【-】: 指定连续时间范围
【/n】: 指定时间频率,每n

示例1:
# crontab -l -u root
* * * * * /usr/bin/date >>/root/data.txt &    # 【*】 表示匹配所有,可以理解成【每】的意思,也就是每分钟执行一下后面的命令

示例2:
30 * * * * /usr/bin/date >>/root/data.txt &     #每个小时的第30分钟执行一下后面的命令,也就是每半个小时执行一次

示例3:
30 8 * * * /usr/bin/date >>/root/data.txt &     #每天8:30分钟执行后面的命令

示例4:
30 23 * * 5 /usr/bin/date >>/root/data.txt &      #每周5晚上23:30分执行后面的命令

示例5:
30 23 1 * 5 /usr/bin/date >>/root/data.txt &     #每周五或每月1日晚上23:30 执行

示例6:
30 23 * * 1-5 /usr/bin/date >>/root/data.txt &     #每周一至周五晚上23:30执行

示例7:
30 23 * * 1,3,5 /usr/bin/date >>/root/data.txt &     #每周一、周三、周五晚上23:30执行

示例8:
0 */2 * * * /usr/bin/date >>/root/data.txt &        #每隔2个小时执行一次后面的命令


案例:
为用户root配置一个定时任务:
每天在本地时间:14:23执行,需要完成的任务操作为:/bin/echo hiya
# crontab -l -u root
35 14 * * * /bin/echo hiya >> /root/hiya.txt

 

5、查看所有用户的crontab任务

#ls /var/spool/cron/      #该目录下存放着所有用户的crontab任务,直接cat 就可以查看用户的定时任务
root

 

6、如何实现秒级的任务?
crontab可配置的最小的时间粒度是分钟,那么我们如何实现秒级的任务呢?有如下两种方式:

相同的任务配置多条,通过sleep来制造执行的时间差,如每10秒执行一次:

* * * * * command
* * * * * sleep 10; command
* * * * * sleep 20; command
* * * * * sleep 30; command
* * * * * sleep 40; command
* * * * * sleep 50; command

 

仅配置一条任务,在任务所执行的脚本内,通过for循环实现每隔n秒执行一次的逻辑,如:
* * * * * script

#!/bin/sh
STEP=5
for ((i=0; i < 60; i+=STEP))
do
  TIME_NOW=$(date "+%Y-%m-%d %H:%M:%S")
  echo -e $TIME_NOW >> /root/scripts/logs/test.log
  sleep $STEP
done

 

posted on 2022-06-08 16:02  tengq  阅读(1677)  评论(0)    收藏  举报

导航