l23.Linux系统定时任务Cron(d)服务应用实践(一)

l23.Linux系统定时任务Cron(d)服务应用实践(一)

本文正在参与「金石方案 . 瓜分6万现金大奖」

13.1 Cron(d)介绍

13.1.1 什么是Cron?

Cron是Linux体系中以后台进程方式周期性履行指令或指定程序使命的服务软件。默许状况下,装置完Linux操作体系之后,Cron服务软件便会发动,服务对应的进程名字为Crond,Crond服务会守时(默许每分钟检查一次)检查体系中是否有需求履行的使命作业方案。假如有,则会依据其预先设定的守时使命规矩主动履行该守时使命作业。这个Crond守时使命服务就适当于咱们平时运用的闹钟(或手机闹钟)。

Linux体系中的Cron守时使命履行的最快频率是每分钟履行一次,因而假如是需求以秒为单位履行的方案使命,Cron就不适用了。面临这种状况,在作业中能够编写Shell脚本,然后作为看护程序履行。以下是一个每秒种履行一次使命的脚本:

[root@centos7 ~]# cat cron.sh
while true
do
    echo "I am neteagle teacher."
    sleep 1
done

提示:当然也有秒级守时使命人员,可是用处不多,因而,读者不需求过多触及。

13.1.2 为什么要运用Crond守时使命?

前文解说过,Linux运维工程师的责任之一便是保证数据安全,那么,其日常作业使命之一便是不断地对数据进行备份,而许多时候白日体系事务繁忙,因而数据备份的作业只能放到晚上履行,例如,网站数据库数据以及用户上传的图片、文件和程序文件等,一般需求每天晚上做一次备份。假如没有守时使命东西,管理员就得每天半夜爬起来,登录到体系中手工履行使命方案,直到履行完才干去睡觉。履行使命的过程可能会持续好几个小时,这样一来,一个晚上管理员就都睡觉了,这样显然是不行的。那么有什么办法能够处理这个周期性地履行使命方案的问题呢?

这就需求Linux体系的守时使命Cron东西了,Cron东西能够很好地帮咱们完结需求重复的、周期性地、主动备份等运维作业。

13.1.3 不同体系的守时使命品种介绍

13.1.3.1 Windows体系的守时使命

在持续解说Linux的守时使命之前,咱们先来看一看Windows的使命方案,Windows体系也是有守时使命方案东西的。

这儿以Windows7体系为例进行阐明,选择“开端”→

“开端”→“附件”→“体系东西”→“使命方案程序”,就会弹出如图13-1所示的窗口。

l23.Linux系统定时任务Cron(d)服务应用实践(一)

图13-1 Windows 7的使命方案图

图13-2所示的是设定好的,每天晚上主动关机的守时使命。

l23.Linux系统定时任务Cron(d)服务应用实践(一)

图13-2 每天晚上主动关机的设置图解

更多信息可见:wenku.baidu.com/view/174cb0…。

13.1.3.2 Linux体系下的守时使命软件

严格地说,Linux体系下的守时使命软件还真不少,例如,at、Cron和anacron等,下面别离来简略介绍一下。

  • at守时使命软件(依靠于atd服务)适合于仅履行一次就结束的调度使命作业。例如,某天夜里需求处理一个作业使命,仅仅是这一天的夜里,关于这种突发性的作业使命,那就能够运用该软件。要使得at这个软件设定的装备生效,还需求提早发动一个名为atd的服务才行,这个东西在作业中的运用需求很少,读者简略了解一下即可。
  • Cron守时使命软件依靠于Crond服务。正如前面所说,经过crontab指令能够装备周期性履行的守时使命作业方案,例如,每5分钟做一次服务器时刻同步。要使得crontab指令设定的装备生效,还需求事前发动一个服务Crong才行。这个Cron东西(对应的crontab指令以及依靠的Crond服务)便是运维工程师在出产作业中最常运用的东西,请我们务必掌握。
  • anacron守时使命软件主要是为非7×24小时开机的服务器预备的,anacron并不能指定具体时刻履行使命作业,而是以天为周期或许在体系每次开机后履行使命作业。它会检测服务器停机期间应该履行可是并没有进行的使命作业,并将该使命履行一遍。

13.1.3.3 Linux体系守时使命Cron(d)

在Linux体系中,Cron是守时使命的软件名,Crond是服务进程名,而crontab指令则是用来设置守时使命规矩的装备指令。

为例更好地了解和学习Cron守时使命,本书将Cron守时使命人工划分为用户守时使命和体系守时使命方案两类,别离论述如下。

(1)用户守时使命方案

Crond服务在作业时会以分钟为单位检查/car/spool/cron途径下以体系用户名的守时使命文件,以确定是否有需求履行的使命方案。假如有,就会将守时使命调度到内存中履行,笔者将这部分文件称为用户守时使命文件,运用crontab指令修改的文件终究都会以当时用户名作为文件名存在于/var/spool/cron途径下。

假如是体系管理员或某个普通用户守时要做的使命作业,例如每隔5分钟与互联网上的时刻服务器进行一次时刻同步,每天晚上0点备份网站站在数据以及数据库数据,就能够运用crontab指令装备在/var/spool/cron途径下。

(2)体系守时使命方案

Crond服务在作业时除了检查/var/spool/cron下的守时使命文件之外,还会检查/etc/cron.d目录以及/etc/anacrontab下的文件内容,里面一般是每天、每周或每月需求履行的使命,假如有需求履行的使命则会履行,体系守时使命的途径一般如下:

[root@centos7 ~]# ll /etc |grep cron
-rw-------. 1 root root   541 Aug 9 2019 anacrontab
drwxr-xr-x. 2 root root    36 Oct 1 16:17 cron.d   #体系守时使命的目录。
drwxr-xr-x. 2 root root    57 Oct 10 19:02 cron.daily   #按天轮询装备的目录。
-rw-------. 1 root root    0 Aug 9 2019 cron.deny
drwxr-xr-x. 2 root root    22 Oct 1 16:05 cron.hourly  #按小时轮询装备的目录。
drwxr-xr-x. 2 root root    6 Jun 10 2014 cron.monthly #按月轮询装备的目录。
-rw-r--r--. 1 root root   451 Jun 10 2014 crontab
drwxr-xr-x. 2 root root    6 Jun 10 2014 cron.weekly  #按周轮询装备的目录。

特别留意:体系途径下的守时使命装备格局与前文解说的用户守时使命的装备格局是不同的。

Crond服务除了履行用户守时使命方案(/var/spool/cron目录)以外,还会周期性地主动履行与操作体系相关的守时使命作业,例如轮询体系日志、备份体系数据、清理体系缓存等,这些使命无需咱们人为干涉。示例代码如下:

[root@centos7 ~]# ll /var/log/messages* #Linux体系的日志被主动轮询,以时刻结束。
-rw-------. 1 root root 916099 Oct 16 20:50 /var/log/messages
-rw-------. 1 root root 2272408 Oct 8 13:17 /var/log/messages-20201008
-rw-------. 1 root root 1144024 Oct 11 14:36 /var/log/messages-20201011
[root@centos7 ~]# ll /var/log/secure*
-rw-------. 1 root root 21799 Oct 16 18:40 /var/log/secure
-rw-------. 1 root root 36582 Oct 8 13:07 /var/log/secure-20201008
-rw-------. 1 root root 15175 Oct 11 13:16 /var/log/secure-20201011

类似于上述的日志轮询作业便是由体系自身来完结的,不需求体系管理员来设置,指令如下:

[root@centos7 ~]# ll /etc/logrotate.conf /etc/cron.daily/logrotate 
-rwx------. 1 root root 219 Apr 1 2020 /etc/cron.daily/logrotate  #每天履行的日志轮询守时使命装备。
-rw-r--r--. 1 root root 662 Jul 31 2013 /etc/logrotate.conf    #日志轮询切开装备文件。

本章讨论的重点是Cron的用户守时使命方案内容,当然,读者也能够自行学习体系使命方案相关的内容,从而让作业中的使命方案按体系使命方案的格局履行也是能够的(此部分内容不是有必要的,也不是本文解说的重点)。

13.2 用户守时使命Cron(d)运用阐明

13.2.1 crontab守时使命修改指令语法

在Linux运维作业中,一般运用crontab指令修改守时使命,crontab的相关参数及阐明如表13-1所示。

表13-1 crontab的相关参数及阐明

l23.Linux系统定时任务Cron(d)服务应用实践(一)

特别强调:-i、-r参数在出产中很少运用,另外,运用crontab指令修改的文件实际上便是在操作“/var/spool/cron/当时用户名”这样的文件。

13.2.2 运用守时使命权限及装备文件阐明

表13-2所示的是守时使命软件相关文件及途径阐明。

表13-2 守时使命软件相关文件及途径阐明

l23.Linux系统定时任务Cron(d)服务应用实践(一)

13.2.3 以用户守时使命crontab指令修改内容格局

默许状况下,待用户树立守时使命规矩之后,该规矩所记录的对应装备文件将会存在于/var/spool/cron中,其crontab装备文件对应的文件名与登录的用户名应一致,例如,root用户的守时使命装备文件为/var/spool/cron/root。

运用crontab指令编写守时使命的书写格局很简略,规矩一般可分为6个段(每个段之间均经过空格来分隔),前5段为时刻设定段,第6段为所要履行的指令或脚本使命段。

用户守时使命编写基本格局如下:

01 * * * * cmd
02 4 * * * cmd

提示:

1)cmd为要履行的指令或脚本,例如/bin/sh/server/scripts/neteagle.sh。

2)每个列之间有必要要有一个空格,能够存在多个空格。

13.2.3.1 用户守时使命编写语法中时刻段的意义

运用crontab指令修改的用户守时使命中的时刻段对应的意义如表13-3所示。

表13-3 crontab指令修改的用户守时使命时刻段阐明

l23.Linux系统定时任务Cron(d)服务应用实践(一)

实践回忆口诀:分时日月周。取值规模回忆:正常日期时刻规模。

13.2.3.2 用户守时使命编写语法中特别字符的意义

在运用crontab指令修改的用户守时使命的语法中,除了时刻段以外,还会包括许多特别字符使用,对应的意义如表13-4所示。

表13-4 用户守时使命编写语法中的特别字符及意义

l23.Linux系统定时任务Cron(d)服务应用实践(一)

13.2.4 crontab指令修改的守时使命依靠服务阐明

crontab指令修改的守时使命依靠于crond服务,下面来看一下它的运转状况,示例代码如下:

[root@centos7 ~]# systemctl status crond    #检查Cron守时使命服务发动状况。
● crond.service - Command Scheduler
#下面的enabled阐明开机Crond为自发动,running为当时发动状况。
  Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
  Active: active (running) since Fri 2020-10-16 13:19:50 CST; 8h ago
 Main PID: 954 (crond)
  CGroup: /system.slice/crond.service
      └─954 /usr/sbin/crond -n
​
Oct 16 13:19:50 centos7 systemd[1]: Started Command Scheduler.
Oct 16 13:19:50 centos7 crond[954]: (CRON) INFO (RANDOM_DELAY wi...)
Oct 16 13:19:55 centos7 crond[954]: (CRON) INFO (running with in...)
Hint: Some lines were ellipsized, use -l to show in full.
[root@centos7 ~]# systemctl restart crond
#守时使命重启指令。

特别强调:

1)在修改守时使命文件之后,无须重启守时使命,Crond会主动检查更改的改变。

2)当守时使命不能正确履行时,请检查守时使命日志文件(/var/log/cron)以获取故障信息。

13.3 用户守时使命Cron实例阐明

下面来看一下用户守时使命Cron的运用实例,实例代码如下:

指令实例1: */1 * * * * /bin/sh /scripts/data.sh

在本例中,除了数字与指令脚本之外,还运用到了符号“ ”, 号的意思是“每一”。

榜首列的意思为分钟,特别符号“/”表明每隔的意思,即每隔一分钟履行一次/bin/sh /scripts/data.sh程序。

指令实例2: 30 3,12 * * * /bin/sh /scripts/netegalge.sh

在本例中,榜首列为30,表明30分钟;第二列为“3,12”,表明3点和12点,此守时使命的意思是每天清晨3点和正午12点的半点时刻(或描述为每天清晨3:30和正午12:30)履行一次/scripts/netegalge.sh脚本使命。

指令实例3: 30 */6 * * * /bin/sh /scripts/neteagle.sh

在本例中,榜首列为30,表明30分钟;第二列“*/6”代表每6个小时,适当于便是6、12、18、24的效果。此守时使命的意思是每隔6个小时的半点时刻履行一次/scripts/neteagle.sh脚本使命。

指令实例4: 30 8-12/2 * * * /bin/sh /scripts/neteagle.sh

在本例中,其间的榜首列为30,表明30分钟;第二列的“8-12/2”代表在早晨8点到下午18点之间每隔2小时,也适当于是将8、10、12、14、16、18单独列出。

那么,此守时使命的意思便是早晨8点到下午18点之间,每隔2个小时的半点时刻履行一次/scripts/neteagle.sh。

指令实例530 21 * * * /application/apache/bin/apachectl graceful

本例表明每晚21:30重启Apache。

指令实例645 4 11022 * * /application/apache/bin/apachectl graceful

本例表明每月1、10、22的清晨4:45分重启一次Apache。

指令实例7: 10 1 * * 6,0 /application/apache/bin/apachectl graceful

本例表明每周六、周日的清晨1:10分重启一次Apache。

指令实例80,30 18-23 * * * /application/apache/bin/apachectl graceful

本例表明在每天18:00至23:00之间每隔30分钟重启一次Apache。

指令实例900 */1 * * * /application/apache/bin/apachectl graceful

本例表明每隔一个小时整点重启一次Apache。

指令实例10: * 2300-07/1 * * * /application/apache/bin/apachectl graceful

本例并不是表明晚上23点和早上0~7点之间每隔一小时重启一次Apache。

需求阐明的是,以上成果是不标准的,也是不对的。我们想想为什么?

以上守时使命的榜首列为“*”,表明每分钟都履行一次使命,即晚上23点和早上0~7点之间每一分钟都重启一次Apache,很可怕吧。

指令实例11: 00 11 * 4 1-3 /application/apache/bin/apachectl graceful

本实例表明4月的每周一到每周三的商务11点整重启一次Apache。

指令实例12: 30 09 * * 0 去上课

本例表明每周日上午9:30去上课,这是上课评率。

指令实例13: 30 08 * * * 去上课

本例表明每天上午8:30去上课,这是上课评率。

经过上述13个比如,信任读者现已能够了解守时使命的装备规矩了。

13.4 出产环境下用户Cron装备专业实践事例

前文是经过守时使命规矩来了解守时使命方案,下文是依据需求来设定守时使命规矩的事例,读者能够自己解答一下,看是否搞懂了。

典范13-1: 每分钟打印一次neteagle字符串到”/server/log/neteagle.log”中。

新手修改守时使命时很容易犯错,因而,一定要养成一个号的修改习气才行,解答本题的具体过程如下。

榜首步: 先在指令行实现要处理的使命,这一步很重要,许多新手直接编写守时使命,成果呈现了各种过错,在练习场景下还好,若是在作业中,可能就会错过使命履行时刻了。在指令行下进行测验的过程如下:

[root@centos7 ~]# echo neteagle >>/server/log/neteagle.log  #指令行履行,将neteagle追加到文件里。
-bash: /server/log/neteagle.log: No such file or directory  #报错,提示每月文件或目录。
[root@centos7 ~]# mkdir -p /server/log  #创立对应不存在的目录。
[root@centos7 ~]# echo neteagle >>/server/log/neteagle.log
[root@centos7 ~]# cat /server/log/neteagle.log  #检查履行后的成果。
neteagle

第二步: 在Linux指令行履行crontab -e。进入vi修改文本的状况之后,输入如下内容:

[root@centos7 ~]# crontab -e
#print my name to log by neteagle at 202010
* * * * * echo neteagle >>/server/log/neteagle.log
:wq

第三步: 保存,检查修改完的守时使命装备。以下是具体指令:

[root@centos7 ~]# crontab -l |head -2
#print my name to log by neteagle at 202010
* * * * * echo neteagle >>/server/log/neteagle.log

第四步: 调查生效状况。以下是具体指令:

[root@centos7 ~]# tail -f /server/log/neteagle.log 
neteagle
neteagle
neteagle

提示:考虑以及装备的标准过程比答案更重要,假如呈现问题,请检查/var/log/cron排错。

本示例的知识小结具体如下。

  • 先承认Crond服务进程是否开启。

  • 书写守时使命规矩前应尽量先写注释,以便利自己以及搭档阅览。

  • 这儿的/server/log目录有必要事前存在才干出成果,因而,在指令行测验履行成功很重要。

  • 守时使命中的一切途径(包括文件和指令等的途径)都尽量运用绝对途径(本题中不加echo也能够)。

  • 假如指令中有重定向符号等,那么结束不要再加>/dev/null 2>&1,否则会犯错。

  • 留意,守时使命的书写操作过程具体如下。

    1)先在指令行调试成功。

    2)再将指令仿制到守时使命装备里。

    3)然后保存,并运用tail -f测验调查成果。

    4)假如遇到问题,则可依据输出以及守时使命日志/var/log/cron文件内容排错。

    典范13-2: 让服务器时刻每5分钟与互联网时刻做一次同步。

    本题的解答思路比较简略,下面直接给出答案如下:

[root@centos7 ~]# crontab -e
#time sync by neteagle at 20201017
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
*/5 * * * * /usr/sbin/ntpdate ntp3.aliyun.com &>/dev/null
:wq
[root@centos7 ~]# crontab -l |tail -3
#time sync by neteagle at 20201017
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
*/5 * * * * /usr/sbin/ntpdate ntp3.aliyun.com &>/dev/null

提示: CentOS 7.6默许没有装置ntpdate指令,需求事前履行yum装置,指令是yum install -y ntpdate。

服务器的时刻同步很重要,因而,在作业中最好是装备两个不同地址的同步使命,在互联网中,可用ntp时刻服务器地址信息检查老男孩的博客地址:

blog.51cto.com/oldboy/2109…。

典范13-3: 每天晚上0点,将站点目录/var/www/html下的内容打包备份到/data目录下,并且要求每次生成不同的备份包名。

榜首步: 承认要备份的数据目录和备份的目的地途径是否存在,假如不存在就创立一个,以便测验。以下是具体的操作过程:

[root@centos7 ~]# ll -d /var/www/html /data
ls: cannot access /var/www/html: No such file or directory  #目录都不存在。
ls: cannot access /data: No such file or directory
[root@centos7 ~]# mkdir -p /var/www/html /data  #创立目录。
[root@centos7 ~]# touch /var/www/html/neteagle{1..5}.txt    #一起创立几个文件。
[root@centos7 ~]# ls /var/www/html/
neteagle1.txt  neteagle3.txt  neteagle5.txt
neteagle2.txt  neteagle4.txt

第二步: 备份数据,一般是采用紧缩打包的方式。以下是指令行测验:

[root@centos7 ~]# cd /var/www/  #打紧缩包,最好是到备份数据目录的上一级目录打包。
[root@centos7 /var/www]# tar zcvf /data/bak_$(date +%F).tar.gz ./html   #带日期打包,目的是不同次备份生成不同的文件。
./html/
./html/neteagle1.txt
./html/neteagle2.txt
./html/neteagle3.txt
./html/neteagle4.txt
./html/neteagle5.txt
[root@centos7 /var/www]# ll /data
-rw-r--r--. 1 root root 182 Oct 17 14:41 bak_2020-10-17.tar.gz

第三步: 将测验成功的指令行写入到文件里履行,。留意,守时使命履行的指令最好是以Shell脚本的方式来履行,这样能够规避许多潜在的运转过错,例如,由“%“导致的过错,代码如下:

[root@centos7 /var/www]# mkdir -p /server/scripts   #标准守时使命脚本存放的途径。 
[root@centos7 /var/www]# cd /server/scripts/    #切换到途径下。
[root@centos7 /server/scripts]# vim bak.sh  #修改脚本。
cd /var/www/&&\ #表明本条指令成功之后再履行下面的tar指令,\表明换行。
/bin/tar zcf /data/bak_$(date +%F).tar.gz ./html    #留意:这儿去掉了-v参数,即不输出信息,打包的文件名中运用了日期变量,这样才干按天生成不同的紧缩包文件。
:wq
[root@centos7 /server/scripts]# rm -f /data/bak*
#删除曾经生成的文件。
[root@centos7 /server/scripts]# /bin/sh /server/scripts/bak.sh 
-rw-r--r--. 1 root root 182 Oct 17 14:43 bak_2020-10-17.tar.gz

第四步:编写守时使命。在Linux指令行履行crontab -e,进入vi修改状况之后,输入以下内容:

[root@centos7 /server/scripts]# crontab -e
#backup size dir by neteagle at 20201017    #清晰的注释。
00 00 * * * /bin/sh /server/scripts/bak.sh >/dev/null 2>&1  #仿制指令行脚本内容到这儿,结束要加>/dev/null 2>&1,将一切输出定向到空。
:wq
[root@centos7 /server/scripts]# crontab -l |tail -2
#backup size dir by neteagle at 20201017
00 00 * * * /bin/sh /server/scripts/bak.sh >/dev/null 2>&1

针对以上两个守时使命的实际使用比如,能够总结一下企业出产环境中守时使命的专业编写标准和操作过程。