
技术弄巷
前言
在Linux运维工作中,很多场景需要让系统自动执行指定操作,比如定时备份数据、定时同步时间、定时执行脚本,手动操作不仅繁琐还容易遗漏。计划任务就是解决这个问题的核心方案,Linux提供了一次性计划任务和周期性计划任务两种方式,满足不同的自动执行需求。本文全程以实操为主,从服务依赖到命令配置、时间规则解读,零基础也能快速上手,让你的Linux系统实现自动化运维。
一、计划任务两大分类
Linux的计划任务按执行频率分为两类,分别适用于不同场景,核心依赖系统专属服务,需保证服务正常运行:
- 一次性任务:仅在指定的某个时间点执行一次,适合临时的、单次的操作需求,依赖
atd服务; - 周期性任务:按指定的时间规则(分/时/日/月/周)重复执行,适合常规的、重复的运维操作,依赖
crond服务。
二、一次性计划任务(atd)
仅执行一次的临时计划任务,核心命令为at,前提是保证atd服务正常运行,否则任务无法生效。
1. 检查atd服务状态(必备前置)
# 查看atd服务运行状态
systemctl status atd
核心状态解读
输出中出现active (running)表示服务正常运行;若显示inactive (dead)需执行systemctl start atd && systemctl enable atd启动并设置开机自启。
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-07-25 10:38:47 CST; 1s ago # 服务正常运行
Main PID: 7722 (atd) # 服务主进程PID
2. 设置一次性计划任务(核心命令:at)
命令格式
at 指定执行时间
实操步骤(全程交互式操作)
以10:41执行创建/tmp/abc目录为例,步骤如下:
# 1. 输入命令指定执行时间,回车进入交互式编辑界面
[root@localhost ~]# at 10:41
# 2. 输入需要执行的命令,每行一个操作
at> mkdir /tmp/abc
# 3. 按【Ctrl + D】提交任务,终端会返回任务编号和执行时间
at> <EOT>
job 2 at Mon Jul 25 10:41:00 2022
时间指定技巧
除了具体时间时:分,还支持更灵活的写法,满足不同临时需求:
- 几分钟后执行:
at now +5 minutes(5分钟后) - 几小时后执行:
at now +2 hours(2小时后) - 具体日期时间:
at 14:30 2026-01-26(2026年1月26日14:30)
三、周期性计划任务(crond)
Linux最常用的计划任务方式,可按分、时、日、月、周的规则重复执行操作,是自动化运维的核心工具,依赖crond服务,需保证服务正常运行。
1. 检查crond服务状态(必备前置)
# 查看crond服务运行状态
systemctl status crond
核心状态解读
输出中active (running)为正常运行状态;若未运行,执行systemctl start crond && systemctl enable crond启动并开机自启(Crond是Linux系统默认开机自启的核心服务)。
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-07-25 09:10:17 CST; 1h 33min ago
Main PID: 6184 (crond)
2. 设置周期性计划任务(核心命令:crontab -e)
crontab -e用于编辑当前用户的周期性计划任务,操作方式与vim编辑器一致(编辑完成按Esc,输入:wq保存退出),创建/修改任务均使用该命令。
# 编辑周期性计划任务
crontab -e
3. crontab核心规则:时间字段写法(重中之重)
编辑任务时,每行一个任务,任务格式严格遵循「时间规则 + 执行命令」,时间规则分为5个字段,顺序固定,字段之间用空格分隔:
分 时 日 月 周 需执行的命令/脚本
# 第1列:分钟(0-59) 第2列:小时(0-23) 第3列:日期(1-31) 第4列:月份(1-12) 第5列:星期(0-7,0和7均代表周日)
常用时间规则实例(直接套用)
结合实际运维场景,整理了高频的时间写法,覆盖单次、区间、间隔、指定日期等所有常用场景,直接复制即可使用:
| | |
|---|
| 30 22 * * * | |
| 0 9 * * 3 | |
| 30 8-10 * * * | |
| 0 20 * * 1-4 | |
| 30 23 * * 1,3,5 | |
| */30 * * * * | |
| 0 8-16/2 * * * | 8/10/12/14/16点的0分,8-16区间内每隔2小时 |
4. crontab操作核心注意事项(避坑关键)
很多同学配置完计划任务后不生效,大多是因为忽略了以下细节,这两点是实操的重中之重,必须严格遵守:
注意1:执行命令必须使用绝对路径
crond服务的执行环境没有系统环境变量,使用相对路径会导致命令无法识别,需用绝对路径执行命令。可通过which 命令查询命令的绝对路径:
# 示例:查询touch命令的绝对路径
which touch
# 输出:/usr/bin/touch → 这就是touch的绝对路径
注意2:命令中的%符号必须转义为\%
%在crontab中有特殊含义(表示换行),若执行的命令中包含%(如date日期格式化),必须在前面加反斜杠\转义,否则任务执行失败。
5. 查看周期性计划任务(核心命令:crontab -l)
crontab -l用于查看当前用户已配置的所有周期性计划任务,直接执行即可输出所有任务的时间规则和执行命令:
# 查看已配置的周期性计划任务
crontab -l
实操示例(含完整可运行任务)
以下为实际配置的任务示例,包含绝对路径使用、%转义、重定向屏蔽输出等实操技巧,可直接参考配置:
# 示例1:每分钟在/tmp创建一个随机10位十六进制名称的文件(touch绝对路径:/usr/bin/touch)
*/1 * * * * /usr/bin/touch /tmp/$(/usr/bin/openssl rand -hex 10)
# 示例2:每分钟在/tmp创建以「日期_时间」命名的目录(date的%转义为\%,mkdir绝对路径:/usr/bin/mkdir)
*/1 * * * * /usr/bin/mkdir /tmp/$(/usr/bin/date +\%F_\%T)
# 示例3:每2小时同步一次时间,屏蔽所有输出(&> /dev/null表示不生成日志,ntpdate绝对路径:/usr/sbin/ntpdate)
* */2 * * * /usr/sbin/ntpdate 120.25.115.20 &> /dev/null