Bootstrap

Linux计划任务

常见的计划任务:进行日志的轮替(log rotate);日志文件分析(logwatch)任务;建立locate数据库;man page查询数据库的建立;RPM软件登录文件的建立;移除暂存档;与网络服务相关的分析行为。

分类

一次性:只执行一次的事项。命令:at

循环性:相隔固定的周期来进行的事项。命令:crontab

一次性计划任务

atd

使用一次性工作排程前,Linux必须有负责这个排程的服务,此服务为 atd。所以应先检查系统并将atd服务打开。

at

使用at指令来设定要进行的工作,并将此工作以文本文件的形式写入 /var/spool/at/ 目录下,等待atd服务的调用执行。

处于安全考虑,并非所有人都可以进行at工作排程,利用 /etc/at.allow 和 /etc/at.deny 这两个文件进行at的使用限制,工作流程如下:

1. 先找寻/etc/at.allow这个文件,写在这个文件中的使用者才能使用at,没有在这个文件中的使用者则不能,使用at (即使没有写在at.deny 当中); .

2.如 果/etc/at.allow 不存在,就寻找/etc/at.deny这个文件,若写在这个at.deny的使用者则不能使用at,而没有在这个at.deny文件中的使用者,就可以使用at咯;

3. 如果两个文件都不存在,那么只有root 可以使用at 这个指令。

命令:at [-mldv] TIME

-m:当at工作完成后以email通知使用者工作完成

-l:相当于 atq,列出目前系统上的at工作排程

-d:相当与 atrm,取消某个at排程

-v:显示at排程中任务列表

TIME:

HH:MM

04:00   在今日的04:00进行,若时刻已超过,则明天的04:00进行此工作

HH:MM YYYY-MM-DD

04:00 2026-01-02   在2026-01-02日04:00进行此工作

HH:MM[am|pm] [Month] [Date]

04:00pm July 30   在7月30日下午04:00进行此工作

HH:MM[am|pm] + number [minutes|hours|days|weeks]

now + 5 minutes   在5分钟后进行此工作

04pm + 3 days 在3天后的下午04:00进行此工作

案例:

机房预计2025-09-20停电,想在2025-09-19 23:00关机

atq

查询目前主机上有多少at的工作排程

atrm

工作号:移除某个at工作排程

循环性

使用者设定

为了安全起见,与at相同,可以限制使用crontab的用户名。cron.allow若存在,优先级高于/etc/cron.deny

  • /etc/cron.allow:将可以使用crontab 的账号写入其中,若不在这个文件内的使用者则不可使用crontab
  • /etc/cron.deny:将不可以使用crontab 的账号写入其中,若未记录到这个文件当中的使用者,就可以使用crontab

当用户使用crontab 这个指令来建立工作排程之后,该项工作就会被纪录到/var/spool/cron/ 里面去了,而且是以账号来作为判别,举例来说,dmtsai 使用crontab 后,他的 工作会被记录到/var/spool/cron/dmsati。

命令

crontab [-u username] [-l|-e|-r]

-u:只有root才能进行这个任务,也可以帮其他使用者建立/移除crontab工作排程

-e:编辑crontab的工作内容

-l:查阅crontab的工作内容

-r:移除所有的crontab工作内容

各项 * * * * * 命令 含义如下

分钟小时日期月份星期几
0-590-231-311-121-7

 星期日可以用 0 或 7 表示。

每周六都与朋友有约,要在每个星期五下午-04:30告诉他周六的约定不要忘

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

30 16 * * 5 mail friend < /home/用户家目录/friend.txt

11月每天的6-12点整之间每隔2小时执行 /app/bin/test.sh

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

0 6-12/2 * 11 * /app/bin/test.sh

11月每天的5、7、9、11点整之间每隔2小时执行 /app/bin/test.sh

0 5-12/2 * 11 * /app/bin/test.sh

实现秒级计划任务:sleep

sleep 数字[后缀]

后缀:

s:秒,默认

m:分

h:时

d:天

[root@centos8 ~]#for i in {1..3};do echo $i;sleep 2;done

配置文件:/etc/crontab,/etc/cron.d/*

cron这个服务最低侦测间隔是分钟,所以cron每分钟会读取一次 /etc/crontab 与 /var/spool/cron 里面内容

/etc/crontab是一个纯文本文档,可以用root编辑,编辑保存后cron就会按设定的来执行了,有时候由于某些原因,cron没有立即生效,可以重启服务 systemctl restart crond

crond读取配置文件的位置

  • /etc/crontab    与系统运作相关
  • /etc/cron.d/*    与系统运作相关
  • /var/spool/cron/*    与用户自己的配置相关

其中 /etc/cron.d/0hourly 里面末行,run-parts 脚本会在大约5分钟内随机选取一个时间来执行 /etc/cron.hourly 目录内的所有执行文件,因此,/etc/cron.hourly 里面的文件必须是能被直接执行的脚本,而不是分时日月周的设定。

总结

个人化的行为使用「crontab-e J: 如果你是依据个人需求来建立的例行工作排程,建议直接使用crontab -e来建立你的工作排程。这样也能保障你的指令行为不会被大家看到

系统维护管理使用「vim /etc/crontab J: 如果你这个例行工作排程是系统的重要工作,为了让自己管理方便,同时容易追踪,建议直接写入/etc/crontab配置

自己开发软件使用「vim /etc/cron.d/newfile」: 如果你是想要自己开发软件,那当然最好就是使用全新的配置文件,并且放置于/etc/cron.d/ 目录内即可。

固定每小时、每日、每周、每天执行的特别工作:如果与系统维护有关,还是建议放置到/etc/crontab 中来集中管理较好。如果想要偷懒, 或者是一定要再某个周期内进行的任务,也可以放置到上面

谈到的几个目录中,直接写入指令即可

anacron

作用:可以执行时间到了却没有执行的排程。(比如某天机房停电,当天部分排程没有做,可以利用此命令去执行已经错过时间未执行的排程)

配置文件:/etc/anacrontab

天数:anacron执行当前与时间戳(/var/spool/anacron/ 内的时间纪录)相差天数,若超过此天数,就准备执行,若没有超过,则不予执行。

延迟时间:若确定超过天数导致要执行排程了,就请延迟时间,因为担心立即启动会有其他资源冲突

工作名称:没实际意义,通常与后续的目录资源名称相同

实际要执行的指令:通过run-parts处理的

anacron执行流程

(以上图中 cron.daily 为例)

由/etc/anacrontab 分析到cron.daily 这项工作名称的天数为1天;

由/var/spool/anacron/cron.daily 取出最近一次执行 anacron的时间戳;

由上个步骤与目前的时间比较,若差异天数为1天以上(含1天),就准备进行指令;

若准备进行指令,根据/etc/anacrontab的设定,将延迟5分钟+ 3小时(看START_ HOURS_ RANGE的设定);

延迟时间过后,开始执行后续指令,亦即「run-parts /etc/cron.daily」这串指令;执行完毕后,anacron程序结束。

crond和anacron关系

crond会主动去读取/etc/crontab, /var/spool/cron/*, /etc/cron.d/* 等配置文件,并依据分、时、日、月、周」的时间设定去各项工作排程;

根据/etc/cron.d/0hourly 的设定,主动去/etc/cron.hourly/ 目录下,执行所有在该目录下的执行文件;因为/etc/cron.hourly/0anacron 这个脚本文件的缘故,主动的每小时执行anacron ,并呼

叫/etc/anacrontab的配置文件;

根据/etc/anacrontab 的设定,依据每天、每周、每月去分析/etc/cron.daily/, /etc/cron. weekly/, /etc/cron.monthly/内的执行文件,以进行固定周期需要执行的指令。

;