Loading

六、系统服务

六、系统服务

6.1 Cron定时任务

Cron是Linux系统中以后台进程模式周期性执行命令或指定程序任务的服务软件。默认情况下,安装完Linux操作系统之后,Cron服务软件便会启动,服务对应的进程名字为Crond,Crond服务会定期(默认每分钟检查一次)检查系统中是否有需要执行的任务工作计划。


在Linux系统中,Cron是定时任务的软件名,Crond是服务进程名,而crontab命令则是用来设置定时任务规则的配置命令。Cron定时任务人工划分为用户定时任务计划和系统定时任务计划两类。


6.1.1 用户定时任务计划

Crond服务在工作时会以分钟为单位查看/var/spool/cron路径下以系统用户名命名的定时任务文件,以确定是否有需要执行的任务计划。如果有,就会将定时任务调度到内存中执行,使用crontab命令编辑的文件最终都会以当前用户名作为文件名存在于/var/spool/cron路径下。


6.1.2 系统定时任务计划

Crond服务在工作时除了查看/var/spool/cron下的定时任务文件之外,还会查看/etc/cron.d目录以及/etc/anacrontab下的文件内容,里面通常是每天、每周或每月需要执行的任务,如果有需要执行的任务则会执行,系统定时任务的路径通常如下:

image-20221108200810069

cron.d:系统定时任务的目录

cron.daily:按天轮询配置的目录

cron.hourly:按小时轮询配置的目录

cron.monthly:按月轮询配置的目录

cron.weekly:按周轮询配置的目录


6.1.3 crontab定时任务使用

crontab定时任务编辑命令语法

image-20221108201849306


使用定时任务权限及配置文件说明

image-20221108202127748


用户定时任务crontab命令编辑内容格式

待用户建立定时任务规则之后,该规则所记录的对应配置文件将会存在于/var/spool/cron中,其crontab配置文件对应的文件名与登录的用户名应一致,例如,root用户的定时任务配置文件为/var/spool/cron/root。


规则一般可分为6个段(每个段之间均通过空格来分隔),前5段为时间设定段,第6段为所要执行的命令或脚本任务段。


用户定时任务编写基本格式如下:

01 * * * * 命令
02 4 * * * 命令

时间记忆口诀:分时日月周。取值范围记忆:正常日期时间范围。

image-20221108203008519


语法中特殊字符的含义

image-20221108203123121


特别强调

1.crontab命令编辑的定时任务依赖于crond服务。

2.在编辑定时任务文件之后,无须重启定时任务,Crond会自动检查更改的变化。

3.当定时任务不能正确执行时,请查看定时任务日志文件(/var/log/cron)以获取故障信息。


Cron实例说明

*/1 * * * * /bin/sh /scripts/data.sh #每隔一分钟执行一次/bin/sh/scripts/data.sh程序
30 3,12 * * * /bin/sh /scripts/data.sh #每天凌晨3点和中午12点的半执行一次
30 */6 * * * /bin/sh /scripts/data.sh  #每隔6个小时的半点时刻执行一次
30 8-18/2 * * * /bin/sh /scripts/data.sh  #早晨8点到下午18点之间,每隔2小时的半点时刻执行一次

生产环境下的定时Cron书写要领

  1. 定时任务规则加上必要的注释,例如,什么人,在什么时间,因为谁(需求方),做了什么定时任务计划。

  2. 所有的定时任务尽量都以脚本的形式执行,如果定时任务计划直接使用Linux命令执行,不但看着不规范,而且也很容易出错,特别是带系统时间变量(如果含有“%”,则必须要转义,即“%”)的任务命令,如果能以文件的形式书写,则可以减少很多潜在的错误。

  3. 在执行的Shell脚本前加上/bin/sh,要确保Cron对应的执行者有访问Shell脚本所在目录的权限,并且可执行该Shell脚本。

  4. 定时任务中在命令或脚本的结尾加上 >/dev/null 2>&1,如果需要打印日志,则可以追加到指定的日志文件里(此时不要与/dev/null同时存在),总之,定时任务计划脚本的结尾尽量不要留空。因为在默认情况下,定时任务每一次执行完毕之后,都会向对应的用户发邮件,如果不加将输出(正确或错误)定向到空的内容(>/dev/null 2>&1),则可能会由于系统未开启邮件服务而导致邮件临时目录文件数猛增的隐患发生,大量小文件占用磁盘Inode节点数量(每个文件占一个Inode),以致磁盘Inode写满而无法再写入正常数据(故障提示:no space left on device.)的故障发生。

  5. 在指定用户下执行相关定时任务,需要root权限执行的任务可以登录到root用户下然后进行设置,如果执行任务不需要root权限,则可以登录到普通用户下(也可以直接在root下通过命令crontab-u oldboy -e直接设置)进行设置。

  6. 生产任务计划程序中不要随意打印输出信息,在开发定时任务程序或脚本时,调试好脚本程序之后,应尽量将Debug及命令输出的内容信息屏蔽掉,如果确实需要输出日志,则可定向到指定的日志文件里,以避免随意输出不做重定向,从而导致系统垃圾的产生。

  7. 定时任务执行的脚本要存放到规范路径下,其实,系统中所有的脚本存放都要有规范,这里推荐统一使用/server/scripts作为脚本的存放路径。

  8. 配置定时任务要规范操作过程,减少出错

    (1)尽量先在命令行测试成功,然后将成功的命令复制到脚本里,新手要在各个细小环节减少出错的机会。

    (2)然后执行测试脚本,测试成功后,将执行脚本的命令完整复制到定时任务配置里,尽量做到少手动输入命令。

    (3)先在测试环境下进行测试,然后在正式环境下规范部署。

    (4)要有检验任务是否正确执行的手段,例如,检查/var/log/cron日志文件,如果任务执行计划频率较低,也要想法确保任务的可执行性,此处可见下文调试定时任务的技巧。

  9. 定时任务脚本中程序命令及路径尽量使用全路径。

  10. 若脚本中调用了系统环境变量,则要重新定义,crontab执行Shell等脚本时只能识别很少的系统环境变量,用户在/etc/profile等文件中定义的普通变量一般是无法被定时任务服务识别的,如果在编写的脚本中需要使用这些环境变量,那么最好是使用export重新声明下该变量,这样脚本才能正常执行。


posted @ 2023-07-17 21:17  YinJayChen  阅读(19)  评论(0编辑  收藏  举报