Linux Crond 服务详解


这里是一段防爬虫文本,请读者忽略。
本文原创首发于CSDN,作者IDYS
博客首页:https://blog.csdn.net/weixin_41633902/
本文链接:https://blog.csdn.net/weixin_41633902/article/details/108814264
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!


写在开头的话

  • 请记住:实践是掌握知识的最快方法
  • 如果你只是怀着看看的态度去快速浏览文章,而不去认认真真的把文章里面讲的任何一个知识点去实践一遍,那么你永远也掌握不了它
  • 生命不息,折腾不止!

Linux Crond 服务详解

00. Crontab命令详解

  • crontab说明

    • 当安装完成操作系统之后,默认便会启动此任务调度命令
    • crontab命令常见于Unix类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于crontab文件中,以供之后读取和执行
    • crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs
    • 新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。
  • crontab参数说明

    • -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
    • -r : 删除目前的时程表
    • -l : 列出目前的时程表
    • -i:在删除用户的crontab文件时给确认提示。
    • -u user:用来设定某个用户的crontab服务,例如,-u ixdba表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
    • file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab
  • 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute hour day month week command

其中:

minute:表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
  • 其中 minute 是表示分钟,hour 表示小时,day 表示一个月份中的第几日,month 表示月份,week 表示一个星期中的第几天。command 表示要执行的程序。
  • minute为 * 时表示每分钟都要执行 commandhour 为 * 时表示每小时都要执行程序,其此类推
  • minutea-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,houra-b 时表示从第 a 到第 b 小时都要执行,其此类推
  • minute*/n 时表示每 n 分钟个时间间隔执行一次,hour*/n 表示每 n 小时个时间间隔执行一次,其此类推
  • minutea, b, c,... 时表示第 a, b, c,… 分钟要执行,f2a, b, c... 时表示第 a, b, c...个小时要执行,其此类推
*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 7) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

01. Crontab file 文件说明

  • 每一分钟执行一次 /bin/ls
* * * * * /bin/ls
  • 在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 ``/usr/bin/backup`:
0 6-12/3 * 12 * /usr/bin/backup
  • 周一到周五每天下午 5:00 寄一封信给 alex@domain.name
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
  • 每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分…执行 echo "haha"
20 0-23/2 * * * echo "haha"
  • 下面再看看几个具体的例子:
0 */2 * * * /sbin/service httpd restart  意思是每两个小时重启一次apache 

50 7 * * * /sbin/service sshd start  意思是每天7:50开启ssh服务 

50 22 * * * /sbin/service sshd stop  意思是每天22:50关闭ssh服务 

0 0 1,15 * * fsck /home  每月1号和15号检查/home 磁盘 

1 * * * * /home/bruce/backup  每小时的第一分执行 /home/bruce/backup这个文件 

00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;  每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。

30 6 */10 * * ls  意思是每月的1、11、21、31日是的6:30执行一次ls命令
  • 设置vim为默认编辑器
[root@www ~] vim /etc/profile
**********
export EDITOR="/usr/bin/vim"

编辑/etc/profile文件,在末尾添加export EDITOR="/usr/bin/vim"

1.1 Crontab -e 到底做了些什么?

  • Crontab -e实际上是对/var/spool/cron/下的文件进行创建修改。用户的crontab文件在该目录下对应与自己的用户名
[root@www ~] ls  -l /var/spool/cron/
total 8
-rw-------. 1 dayuanshuai dayuanshuai 61 Sep 26 10:52 dayuanshuai  
-rw-------. 1 root        root        79 Sep 26 11:14 root

/var/spool/cron/dayuanshuai这个文件实际上是dayuanshuai用户的定时任务文件

/var/spool/cron/root这个文件是用户root自己的定时任务文件

  • 当执行crontab -e文件时,实际上是在/var/spool/cron/下创建对应于要执行crontab定时任务的用户名文件,并且将其权限设置为600
# 查看 /var/spool/cron 下面的文件
[root@www ~] ls  -l /var/spool/cron/
total 8
-rw-------. 1 dayuanshuai dayuanshuai 61 Sep 26 10:52 dayuanshuai
-rw-------. 1 root        root        79 Sep 26 11:14 root

# 为 xiao 用户设置 定时任务
[root@www ~] crontab -u xiao -e
no crontab for xiao - using an empty one
# test

# 这个时候 再次查看 /var/spool/cron 目录下的信息,发现多出了 一个 名为 xiao的文件, 和xiao用户名对应。
[root@www ~] ls  -l /var/spool/cron/
total 12
-rw-------. 1 dayuanshuai dayuanshuai 61 Sep 26 10:52 dayuanshuai
-rw-------. 1 root        root        79 Sep 26 11:14 root
-rw-------. 1 root        root         7 Sep 26 11:38 xiao

# 查看 xiao 文件的内容,发现和我刚才 编辑的定时任务内容一致
[root@www ~]  cat /var/spool/cron/xiao 
# test

注意:不要用vim编辑器编辑/var/spool/cron/下对应的定时任务文件,因为这样可能会因为你输入的语法错误,导致无法执行cron

1.2 如何禁止某些用户使用 cron 定时任务

  • /etc/cron.deny文件里面添加禁止使用cron服务的用户
# 将 xiao 用户 添加到 该文件当中
[root@www ~] vim /etc/cron.deny 
xiao

# 用 xiao 用户 crontab -e 测试一下。 发现其权限已经不被允许
[xiao@www ~] crontab -e
You (xiao) are not allowed to use this program (crontab)
See crontab(1) for more information
  • 给予权限
# 剔除掉 xiao 用户 的禁止权限
[root@www ~] vim /etc/cron.deny 

# 再次以xiao用户执行 crontab -e ,发现其已经可以编辑了定时任务了
[xiao@www ~] crontab -e
# test

1.3 Cron 的日志文件

  • cron的日志文件存放于/var/log目录下
# 可以看到这里面有很多以 cron 开头的文件
[root@www ~] ls /var/log/cron
cron           cron-20190825  cron-20190901  cron-20200925  

# cron 日志的记录采用增量 的方式去记录
# cron 文件里面存放的cron 日志是 现在和最近一段时间的cron日志
# cron-20200925 里面存放的是 cron 从 20200925日 到以前一段时间的日志

1.4 脚本无法执行问题

  • 如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。

解决方法:

  • 1、所有命令需要写成绝对路径形式,如: /usr/local/bin/docker

  • 2、在 shell 脚本开头使用以下代码:

    #!/bin/sh
    
    . /etc/profile
    . ~/.bash_profile
    

    3、在 etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得好几遍了生效,例如:

    20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh
    

02. crontab 命令演示

  • mail命令:发送邮件的命令
  • -s<邮件主题>:指定邮件的主题
    • mail -s test dayuanshuai < file :以file的内容为邮件内容发信给dayuanshuai用户
  • 用户编辑自己的crontab文件
[root@www ~] crontab -e
  • 查看dayuanshuai用户的crontab定时任务
[root@www ~] crontab -l -u dayuanshuai
# dayuanshuai user exec
* * * * * /usr/bin/whoami
  • 查看自己的crontab任务
[root@www ~] crontab -l
  • 编辑dayuanshuaicrontab定时任务文件
[root@www ~] crontab -e -u dayuanshuai 
# dayuanshuai user exec
* * * * * /bin/echo "who" >> a.txt # 每分钟给 a.txt 文件 追加 a.txt 信息
  • 设置定时任务
[root@www sh] crontab  -e
# 定时设置时间
0 6-23/2,0 * * *  ntpdate ntp1.aliyun.com >/dev/null 2>&1  # 6点整到23点整每隔2个小时,执行一次 ntpdate ntp1.aliyun.com >/dev/null 2>&1, 最后0 点执行一次  ntpdate ntp1.aliyun.com >/dev/null 2>&1

使用crontab命令执行定时任务,里面的命令最好使用绝对路径

  • 使用crontab -r会删除对应用户crontab配置文件的所有内容
# 查看 xiao 用户 crontab 的配置文件
[root@www sh] crontab -l -u xiao
# test
# jsdjssj
# sd;ds;ld
[root@www sh] crontab -r -u xiao   # 清除 xiao 用户 crontab 的配置文件 
[root@www sh] crontab -l -u xiao  # 再次查看,发现 xiao 用户的 crontab 配置文件 已经被删除
no crontab for xiao
[root@www sh] ls /var/spool/cron/
dayuanshuai  root

03. 系统的配置文件: /etc/crontab/etc/cron.d/*

3.1 配置文件说明

  • crontab -e是针对用户的cron来设计的。如果要执行系统的例行性任务时,那么我们就不必使用crontab -e这种方式了,我们只需编辑/etc/crontab文件即可

每次修改完/etc/crontab的配置文件,记得重启下crond服务

  • crond服务读取配置文件的位置
    • 一般来说,crond默认有3个地方会执行脚本配置文件,他们分别是
/etc/crontab
/etc/cron.d/*
/var/spool/cron/*

跟系统运行有关系的配置文件时/etc/crontab文件和/etc/cron.d/*目录内的文件。跟用户自己的任务有关系的配置文件,就是放在/var/spool/cron里面的文件

  • 查看/etc/cron.d/目录下的文件
# 查看 /etc/cron.d 目录下的文件
[root@www cron.d] ls -l /etc/cron.d/
total 4
-rw-r--r--. 1 root root 113 Nov 23  2013 0hourly

# 发现其 运行  加载/etc/cron.hourly 这个目录
[root@www cron.d] cat /etc/cron.d/0hourly 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly
  • /etc/cron.d的适用场景
    • 如果你想要自己开发新的软件,该软件要拥有自己的crontab定时命令时,就可以将【分 时 月 周 身份 命令 】的配置文件放置到/etc/cron.d目录下,在此目录下的文件是crontab的配置文件脚本
  • 详细说明一下上面的01 * * * * root run-parts /etc/cron.hourly这一行含义。
    • run-parts:如果你去分析一下run-parts这个执行文件,会发现它就是shell脚本。run-parts脚本会在大约5分钟内随机选一个时间来执行/etc/cron.houly目录内的所有执行文件。因此,放在/etc/cron.hourly的文件,必须是能被直接执行的命令脚本。而不是分、时、日、月、周、的设置值。这是一个值得注意的地方
    • 所以说如果你需要在每个小时的前5分钟,执行一个脚本。那么你便可以将脚本放置在/etc/cron.hourly下面

3.2 注意事项

  • 切莫将定时脚本设置在同一个时间点上执行。这样的话,多个定时任务脚本在同一时间执行,会导致系统的资源消耗率在那个时间点上耗费得非常的大。
  • 可以将他们分别间隔几分钟执行一次
3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60 * * * * root CMD1
1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58 * * * * root cmd2
2,5,8,11,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59 * * * * root CMD2

这样的话,就可以解决资源消耗率过高的问题

  • 设置开机自启动执行,将更新系统时间设置为开机自启动
[root@www cron.d] vim /etc/rc.d/rc.local 
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
ntpdate ntp2.aliyun.com > /dev/null 2>&1


写在最后的话:

  • 无论每个知识点的难易程度如何,我都会尽力将它描绘得足够细致
  • 欢迎关注我的CSDN博客,IDYS’BLOG
  • 持续更新内容
    linux基础 | 数据通信(路由交换,WLAN) | Python基础 | 云计算
  • 如果你有什么疑问,或者是难题。欢迎评论或者私信我。你若留言,我必回复!
  • 虽然我现在还很渺小,但我会做好每一篇内容。谢谢关注!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值