常见的计划任务:进行日志的轮替(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-59 | 0-23 | 1-31 | 1-12 | 1-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/内的执行文件,以进行固定周期需要执行的指令。