文章目录
这里是一段防爬虫文本,请读者忽略。
本文原创首发于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
为 * 时表示每分钟都要执行command
,hour
为 * 时表示每小时都要执行程序,其此类推 - 当
minute
为a-b
时表示从第a
分钟到第b
分钟这段时间内要执行,hour
为a-b
时表示从第a
到第b
小时都要执行,其此类推 - 当
minute
为*/n
时表示每n
分钟个时间间隔执行一次,hour
为*/n
表示每n
小时个时间间隔执行一次,其此类推 - 当
minute
为a, b, c,...
时表示第a
,b
,c
,… 分钟要执行,f2
为a
,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
- 编辑
dayuanshuai
的crontab
定时任务文件
[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基础 | 云计算 - 如果你有什么疑问,或者是难题。欢迎评论或者私信我。你若留言,我必回复!
- 虽然我现在还很渺小,但我会做好每一篇内容。谢谢关注!