Alex_McAvoy

想要成为渔夫的猎手

Linux 例行性工作调度

【例行性工作调度】

在 Linux 中,存在两种工作调度方式,一种是例行性的,即每隔一定周期执行的工作,另一种是突发性的,即这次工作完成后就结束调度

在 Linux 中,例行性工作调度依靠 Crond 服务的支持,通过 crontab 命令来实现

at 命令类似,考虑到安全性的问题,crontab 命令也进行了限制

  • /etc/cron.allow:可以使用 crontab 的账号写入其中
  • /etc/cron.deny:不可以使用 crontab 的账号写入其中

同样,以优先级来说,/etc/cron.allow 的优先级要高于 /etc/cron.deny,一般来说,从判断上来考虑,这两个文件只需要保留一个即可,以免影响在设置上的判断

当用户使用 crontab 命令新建工作调度后,该项工作就会记录在 /var/spool/cron/ 中,且是以账号作为判别依据的

【crontab 命令】

crontab 命令为:crontab [选项],常见选项如下

  • -u:后接 username,只有 root 用户才可进行该任务,即帮助账号名为 username 的用户新建、删除 Crontab 工作调度
  • -e:编辑 Crontab 的工作内容
  • -l:查阅 Crontab 的工作内容
  • -r:删除所有的 Crontab 的工作内容,若要仅删除一项,使用 -e 选项编辑即可

在 Crontab 中,每行都代表一项工作,如下例,前五个字段分别代表分钟、小时、日期、月份、周,后续的字段为要执行的工作命令

1
2
# 以 alex_mcavoy 的身份每天在 12:00 发信给自己
0 12 * * * mail alex_mcavoy -s "at 12:00" < /home/alex_mcavoy/.bashrc

对于前五个时间字段来说,其数字范围如下表

意义 范围
分钟 0 ~ 59
小时 0 ~ 23
日期 1 ~ 31
月份 1 ~ 12
周几 0 ~ 7(0、7 均代表周天)

此外,还有一些辅助字符

字符 代表意义 实例 实例含义
* 任何时刻均接受 0 12 * * * command 每天的 12:00
都执行后续命令
, 分隔时段 0 3,6 * * * command 每天的 3:00 和 6:00
都执行后续命令
- 时间范围 20 8-12 * * * command 每天的 8 点到 12 点
每隔 20 分钟都执行一次后续命令
/num 每隔 num 单位间隔 */5 * * * * command 每隔 5 分钟执行一次后续命令

【/etc/crontab 配置文件】

crontab -e 是针对用户的 Cron 来设计的,其实质上是对 /usr/bin/crontab 这个文件进行修改

若是系统的例行性工作,则需要对 /etc/crontab 进行修改,Cron 服务会每分钟读取一次该文件的数据内容,从而进行系统的例行性工作调度

【anacron 服务】

若 Linux 主机是 24 小时全天午休运行的服务器,那么仅需要 atd、crond 这两个服务即可管理工作调度

若 Linux 主机并非是 24 小时无间断开机,那么就需要 anacron 服务了

anacron 服务并不能指定何时执行某项任务,而是以天为单位,或开机后立刻进行 anacron 的操作,去检测停机期间应该进行但是没有进行的 Crontab 任务,并将该任务执行

anacron 服务会去分析当前时间与时间记录文件所记载的上次执行 anacron 的时间,若比较两者后发现有区别,那就是在某些时刻没有进行 Crontab 任务,此时 anacron 就会开始执行未进行的 Crontab 任务

感谢您对我的支持,让我继续努力分享有用的技术与知识点!