Linux基础学习笔记之——例行性工作

例行性工作

1、循环执行的例行性工作

1.1、使用者的设定

使用的限制数据有:

  • /etc/cron.allow

    将可以使用 crontab 的账号写入其中,若不在这个文件中的使用者则不能使用 crontab;

  • /etc/cron.deny

    将不可以使用 crontab 的账号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab。

/etc/cron.allow 的优先级比 /etc/cron.deny 高!一般来说,两者保留一个即可。

当用户使用 crontab 这个指令来建立工作安排后,该项工作就会被记录到 /var/spool/cron/ 里边去,而且是以账号来作为判别的!

crontab 的语法:

[root@li ~]# crontab [-u 账号] [-l|-e|-r]
选项与参数:
-u:只有 root 才能使用的参数,帮助其他使用者建立/移除 crontab 工作
-e:编辑 crontab 的工作内容
-l:查阅 crontab 的工作内容
-r:移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 编辑
#用 li 的身份在每天的 12:00 发邮件给自己
[li@li ~]$ crontab -e
0 12 * * * mail -s "at 12:00" li < /home/li/.bashrc

上面编辑内容的六个字段分别表示的是:

代表意义 分钟 小时 日期 月份 指令
数字范围 0-59 0-23 1-31 1-12 0-7 指令

比较有趣的是那个 “周”,0 和 7都代表星期天。另外,还有一些辅助的字符:

特殊字符 说明
* 代表任何时刻都接受!
, 代表分隔时段的意思
- 代表一段时间
/n n 是数字,代表每隔一段时间

1.2、系统的配置文件:/etc/crontab,/etc/cron.d/*

这个 “crontab -e” 是针对使用者的 cron 来设计的,如果是 “系统的例行性工作” 时,该怎么办呢?是否还是需要以 “crontab -e” 来管理呢?当然不行了,你只要编辑 /etc/crontab 这个文件就可以了。有一点需要注意的是,crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个执行文件,但是 /etc/crontab 可是一个存文本文件。

[root@li ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root		#若有额外的 STDOUT,以 email 将数据发给谁

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

1.2.1、crond 服务读取配置文件的位置

一般来说,crond 预设有三个地方会有执行脚本配置文件:

  • /etc/crontab
  • /etc/cron.d
  • /var/spool/cron/*

在这三个地方中,跟系统的运作比较有关系的是 /etc/crontab 文件以及 /etc/cron.d/* 目录内的文件,另一个是跟用户自己的工作比较有关系的配置文件,就放在 /var/spool/cron/ 里边。现在来看看 /etc/cron.d 里边的文件:

[root@li cron.d]# ll /etc/cron.d
总用量 4
-rw-r--r--. 1 root root 128 8月   9 2019 0hourly
[root@li cron.d]# ls /etc/cron.*
/etc/cron.deny

/etc/cron.d:
0hourly

/etc/cron.daily:
logrotate  man-db.cron

/etc/cron.hourly:
0anacron

/etc/cron.monthly:

/etc/cron.weekly:

[root@li cron.d]# 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

请注意最后一行,每个整点的一分会执行 run-parts /etc/cron.hourly 这个指令。那什么是 run-parts 呢?如果你有去分析一下这个执行文件,会发现它是一个 shell script,run-parts 脚本会在大约 5 分钟内随机选一个时间来执行 /etc/cron.hourly 目录内的所有执行文件!因此,放在 /etc/cron.hourly/ 的文件,必须是能被直接执行的指令脚本。

在 /etc 底下还有 cron.daily/、/etc/cron.monthly、/etc/cron.weekly,这三个文件与 /etc/cron.hourly 所不同的是,这三个目录是由 anacron 所执行的,而 anacron 的执行方式则是放在 /etc/cron.hourly/0anacron 里面的。

总结如下:

  • 个人化的行为使用 crontab -e:如果你是依据个人需求来建立的例行性工作,建议直接使用 crontab -e 来建立你的工作!这样也能保证你的指令行为不被别人看到。
  • 系统维护管理使用的 vim /etc/crontab:如果你这个例行性工作是系统的重要工作,为了让自己管理方便,同时容易追踪,建议直接写入 /etc/crontab。
  • 自己开发的软件使用 vim /etc/cron.d/newfile。
  • 固定每小时、每日、每周、每天执行的特别工作:如果与系统维护有关,还是建议放置到 /etc/crontab 中。

2、可唤醒停机期间的工作任务

2.1、什么是 anacron

anacron 并不是用来取代 crontab 的,anacron 存在的目的是处理非 24 小时一直启动的 Linux 系统的 crontab 的执行!以及因为某些原因导致的超过时间而没有被执行的例行工作

2.2、anacron 与 /etc/anacrontab

anacron 其实是一支程序而非一个服务。

[root@li cron.d]# cat /etc/cron.hourly/0anacron
#!/bin/sh
# Check whether 0anacron was run today already
if test -r /var/spool/anacron/cron.daily; then
    day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
    exit 0;
fi

# Do not run jobs when on battery power
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power >/dev/null 2>&1
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s

anacron 的基本语法:

[root@li cron.d]# anacron [-sfn] [job]...
[root@li cron.d]# anacron -u [job]...
选项与参数:
-s:开始一连续的执行各项工作(job),会依据时间记录文件的数据判断是否进行
-f:强制进行,而不去判断时间记录文件的时间戳
-n:立刻进行未进行的任务,而不延迟等待时间
-u:仅更新时间记录文件的时间戳,不进行任何工作
job:由 /etc/anacrontab 定义的各项工作

anacron 的配置文件:

[root@li cron.d]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45		#随机给予最大延迟时间,单位是分钟
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22		#延迟多少个小时内应该要执行的任务时间

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
[root@li cron.d]# more /var/spool/anacron/*		#时间戳文件
::::::::::::::
/var/spool/anacron/cron.daily
::::::::::::::
::::::::::::::
/var/spool/anacron/cron.monthly
::::::::::::::
::::::::::::::
/var/spool/anacron/cron.weekly
::::::::::::::

我们拿 /etc/cron.daily 那一行的设定来说明。那四个字段的意思:

  • 天数:anacron 执行当下与时间戳(/var/spool/anacron/ 内的时间记录文件)相差的天数,若超过此天数,就准备开始执行,若没有超过此天数,则不给予执行后续指令;
  • 延迟时间:若确定超过了天数导致要执行例行工作了,那么请延迟执行的时间,因为担心立刻启动会有其他资源冲突的问题;
  • 工作名称定义;
  • 实际要执行的指令。

根据上面的配位文件内容,我们大概知道 anacron 的执行流程应该是这样的:

  1. 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天;
  2. 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳;
  3. 由上个步骤与目前的时间比较,若差异天数为 1 天以上(含 1 天),就准备执行指令;
  4. 若准备进行指令,根据 /etc/anacrontab 的设定,将延迟 5 分钟 + 3 小时;
  5. 延迟时间过后,开始执行后续指令,即 run-parts /etc/cron.daily;
  6. 执行完毕后,anacron 程序结束。

最后,我们总结一下:

  1. crond 会主动读取 /etc/crontab,/var/spool/cron/*,/etc/cron.d/* 等配置文件,并依据 “分、时、日、月、周” 的时间设定去执行各项工作安排;
  2. 根据 /etc/cron.d/0hourly 的设定,主动去 /etc/cron.hourly 目录下,执行所有在该目录下的执行文件;
  3. 因为 /etc/cron.hourly/0anacron 这个脚本文件的缘故,主动地每小时执行 anacron,并呼叫 /etc/anacrontab 的配置文件;
  4. 根据 /etc/anacrontab 的设定,依据每天、每周、每月去分析 /etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly 内的执行文件,以进行固定周期需要执行的指令。

也就是说,如果你每个周日的需要执行的动作是放置在 /etc/crontab 的话,那么该动作只要过期了就过期了,并不会被抓回来重新执行。但是如果是放置在 /etc/cron.weekly 目录下,那么该工作就会定期,几乎一定会在一周内执行一次。如果你关机超过一周,那么一开机后的数个小时内,该工作就会主动的被执行!

猜你喜欢

转载自blog.csdn.net/qq_36879493/article/details/108033044