Linux 定时任务踩坑合集!at 一次性任务 + crontab 循环定时完整实操

发布时间:2026/7/30 2:25:21
Linux 定时任务踩坑合集!at 一次性任务 + crontab 循环定时完整实操 文章目录Linux 计划任务管理一、一次性计划任务 at只执行1次的定时任务核心作用1. atd 服务安装、查看状态2. at 命令基础语法示例15分钟后执行单行命令示例2通过脚本文件批量执行多条命令支持的时间格式timespec全部说明3. at 配套管理命令查看/指定队列/查看任务详情/删除任务1at -l / atq 查看所有等待执行的任务2-q 指定任务队列3at -c 查看任务完整内容4at -d / at -rm 删除等待中的定时任务4. at 用户权限控制 /etc/at.allow / /etc/at.deny二、用户周期性计划任务 crontab循环重复执行核心作用1. crontab 全部子命令详解crontab -l 查看当前用户定时任务crontab -e 编辑当前用户定时任务crontab任务单行标准格式6段必须全部看懂定时任务示例逐行拆解实操案例crontab -r 删除当前用户全部定时任务crontab -u 管理员root操作其他用户定时任务crontab 文件名 从文件导入定时任务2. 配套练习完整逐行注释步骤1 创建脚本步骤2 配置定时任务步骤3 监控任务运行三、系统周期性计划任务管理员全局任务所有用户共用核心作用1. /etc/crontab 系统主定时文件头部全局变量逐行解释和用户crontab核心区别2. /etc/cron.d 自定义系统任务目录3. /etc/anacrontab 补执行定时任务关机补救全局变量解释任务4字段完整拆解Linux 计划任务管理一、一次性计划任务 at只执行1次的定时任务核心作用at 用来设置未来某一个时间点只运行一次的任务。 举例5分钟后自动备份文件、今晚23点自动关机只执行一次执行完任务自动消失。 底层依赖后台守护进程atd没有这个进程at任务不会自动运行。1. atd 服务安装、查看状态# 安装at工具包系统最小化安装默认不带at[rootcentos7 ~]# yum install at逐段解释yumCentOS7系统软件包管理器用来下载、安装rpm软件installyum子命令代表执行安装操作at要安装的软件包名称包含at、atq、atrm全套定时工具# 查看atd后台服务运行状态[rootcentos7 ~]# systemctl status atd逐段解释systemctlCentOS7统一管理系统服务的工具status子命令查看指定服务当前运行状态atd一次性定时任务的后台守护进程名所有at任务靠它调度执行输出字段详细解释● atd.service - Job spooling tools# 服务名称atd服务作用管理队列定时任务Loaded: loaded(/usr/lib/systemd/system/atd.service;enabled;vendor preset: enabled)# Loaded服务配置文件路径enabled开机自启系统出厂默认开启Active: active(running)since Wed2022-12-2116:54:08 CST;3min 22s ago# Activerunning正在运行显示启动时间、已经运行多久Main PID:1184(atd)# Main PID守护进程的系统进程号1184Tasks:1# 当前进程内部线程数量1个CGroup: /system.slice/atd.service └─1184 /usr/sbin/atd-f# 进程实际运行程序路径 /usr/sbin/atd -fDec2116:54:08 centos7.linux.com systemd[1]: Started Job spooling tools.# 系统日志系统启动成功拉起atd服务2. at 命令基础语法语法at 时间格式工作逻辑输入这条命令后终端进入任务编辑模式输入要执行的命令按下CtrlD保存任务atd到时间自动执行。示例15分钟后执行单行命令[rootcentos7 ~]# at now 5 minutes# 进入at编辑模式atechohello world/tmp/hello.log# 输入完指令按CtrlD保存任务文档中EOT就是CtrlD生成的结束标记atEOTjob1at Wed Dec2117:09:002022逐行拆解at now 5 minutesat进入定时任务编辑模式now当前系统时间5 minutes往后推迟5分钟 整体含义5分钟后执行下面输入的命令echohello world/tmp/hello.logecho hello world输出字符串 hello world输出重定向符号不打印到屏幕写入文件/tmp/hello.log临时日志文件存放输出内容CtrlD结束输入保存任务系统分配任务编号 job 1job 1 at xxx返回信息任务ID1执行时间示例2通过脚本文件批量执行多条命令适合多条复杂指令不用手动一行行输入at交互界面# 1. 创建脚本文件[rootcentos7 ~]# vim myscript.sh脚本内容#!/bin/bashdate/tmp/myscript.logechohello myscript/tmp/myscript.log脚本逐行解释#!/bin/bash脚本声明指定用bash解释器运行文件必须写在第一行date输出当前系统时间追加写入不覆盖原有文件内容echo hello myscript输出文本追加写入日志# 方式1输入重定向读取脚本创建任务[rootcentos7 ~]# at now 5 minutes myscript.shjob2at Wed Dec2117:10:002022参数解释 myscript.sh输入重定向把myscript.sh里面所有命令导入at替代手动输入# 方式2使用-f参数指定脚本文件[rootcentos7 ~]# at now 100 minutes -f myscript.shjob3at Wed Dec2118:46:002022参数解释-ffile缩写指定要读取的脚本文件和重定向效果完全一致支持的时间格式timespec全部说明now 5 hours当前时间往后5小时teatime tomorrow明天16点teatime固定代表16:00noon 4 days4天后中午12点noon固定12点5 pm august 3 20162016年8月3日下午5点 时间规则存放文档/usr/share/doc/at/timespec可打开查看全部写法3. at 配套管理命令查看/指定队列/查看任务详情/删除任务1at -l / atq 查看所有等待执行的任务两条命令功能完全等价[rootcentos7 ~]# at -l1Wed Dec2117:09:002022a root2Wed Dec2117:10:002022a root3Wed Dec2118:46:002022a root[rootcentos7 ~]# atq1Wed Dec2117:09:002022a root2Wed Dec2117:10:002022a root3Wed Dec2118:46:002022a root输出字段拆解数字 1/2/3任务编号job id删除、查看任务详情需要用到日期时间任务预定执行时间字母a任务队列名称at一共26个队列a-z字母越靠后优先级越低root创建该任务的用户2-q 指定任务队列[rootcentos7 ~]# at -q b now 5 minutes myscript.shjob4at Wed Dec2117:11:002022参数解释-q b指定该任务放入b队列a队列优先级高于b队列系统优先调度a队列任务# 只查看b队列任务[rootcentos7 ~]# at -l -q b4Wed Dec2117:11:002022b root-q b过滤只展示b队列任务3at -c 查看任务完整内容[rootcentos7 ~]# at -c 3参数解释-ccat缩写读取任务完整脚本内容3要查看的任务ID号 输出内容解释系统自动生成shell脚本包含你写的所有执行命令分隔符是系统自动生成不用手动修改4at -d / at -rm 删除等待中的定时任务两条命令等价[rootcentos7 ~]# atrm 3[rootcentos7 ~]# atqatrmat remove删除at任务后面数字是任务ID执行后atq查询看不到3号任务代表删除成功4. at 用户权限控制 /etc/at.allow / /etc/at.deny作用限制哪些用户可以使用at定时任务防止普通用户滥用定时任务占用服务器资源 匹配优先级规则逐条看懂如果/etc/at.allow文件存在只有写在这个文件内的用户才能使用at其余全部禁止如果/etc/at.allow不存在读取/etc/at.deny文件内写的用户禁止使用at其余所有人允许查看系统默认配置[rootcentos7 ~]# ls /etc/at.*/etc/at.deny[rootcentos7 ~]# cat /etc/at.deny# 内容为空解读系统没有at.allowat.deny是空文件所有用户都可以使用at命令二、用户周期性计划任务 crontab循环重复执行核心作用at只能执行一次crontab可以循环执行每分钟、每小时、每天、每周、每月重复执行任务。 底层守护进程crond系统默认开机自启。 区分用户级定时任务每个普通用户独立拥有自己的定时任务互不干扰。1. crontab 全部子命令详解crontab -l 查看当前用户定时任务[jhlcentos7 ~]$crontab-lnocrontabforjhl参数解释-llist缩写列出当前登录用户全部定时任务no crontab for jhl用户jhl还没有创建任何定时任务crontab -e 编辑当前用户定时任务[jhlcentos7 ~]$exportEDITORvim[jhlcentos7 ~]$crontab-e逐行解释exportEDITORvimLinux默认crontab编辑器是vi这条命令临时修改编辑器为vim操作更友好EDITOR系统环境变量定义文本编辑器程序-eedit缩写编辑当前用户定时任务文件crontab任务单行标准格式6段必须全部看懂分 时 日 月 周 执行命令字段顺序、取值范围、符号规则完整拆解字段含义取值范围特殊符号说明第1段分钟0-59* 任意x-y范围x,y多值*/x间隔第2段小时0-23同上第3段几号1-31同上第4段月份1-12 / Jan-Feb同上第5段星期0-70/7周日1周一同上第6段命令任意shell指令/脚本%代表换行需要转义特殊符号逐字解释*代表所有值每分钟/每小时/每天都匹配x-y连续范围例如9-16 代表9、10、11、12、13、14、15、16x,y离散多值例如2,6 代表2点、6点*/x每隔x单位执行一次*/2每2分钟定时任务示例逐行拆解示例1每年2月2日早上9点执行备份脚本0922* /usr/local/bin/yearly_backup分段解析 0 → 第0分钟9 → 9点2 → 2号2 → 2月* → 星期无限制执行备份脚本示例27月每周五9点~16点每5分钟执行输出*/59-16 * Jul5echoChime分段解析/5 每5分钟9-16 9至16点任意日期Jul 7月5 周五执行echo输出示例3周一至周五23点58分执行日报脚本5823* *1-5 /usr/local/bin/daily_report分段解析 58分23点任意日期任意月份1-5周一到周五执行脚本示例4工作日早上9点发送邮件09* *1-5mutt-sChecking inbossexample.com % Hi boss, just checking in.特殊说明%在crontab中代表换行不需要转义后面内容作为邮件正文实操案例[jhlcentos7 ~]$exportEDITORvim[jhlcentos7 ~]$crontab-e# 写入定时规则*/22,6-23 * * *date/tmp/date.log[jhlcentos7 ~]$crontab-l*/22,3-23 * * *date/tmp/date.log规则拆解*/2每2分钟2,6-232点、6点至23点每日每月任意星期输出时间追加到日志# 实时监控日志输出验证定时任务是否运行[jhlcentos7 ~]$tail-f/tmp/date.logtail查看文件末尾内容-f实时跟踪文件新增内容crontab -r 删除当前用户全部定时任务[jhlcentos7 ~]$crontab-r[jhlcentos7 ~]$crontab-lnocrontabforjhl参数解释-rremove清空当前用户所有定时任务不可恢复crontab -u 管理员root操作其他用户定时任务只有root用户有权限使用-u指定其他用户名[rootcentos7 ~]# crontab -u jhl -e0922* /usr/local/bin/yearly_backup09* *1-5mutt-sChecking inbossexample.com % Hi boss, just checking in.[rootcentos7 ~]# crontab -u jhl -r[rootcentos7 ~]# crontab -u jhl -lnocrontabforjhl参数解释-u jhl指定操作用户jhl搭配-e编辑、-r删除、-l查看crontab 文件名 从文件导入定时任务[jhlcentos7 ~]$vimmycron# 文件内写入两条定时规则0922* /usr/local/bin/yearly_backup09* *1-5mutt-sChecking inbossexample.com % Hi boss, just checking in.# 将文件内容覆盖当前用户所有定时任务[jhlcentos7 ~]$crontabmycron[jhlcentos7 ~]$crontab-l0922* /usr/local/bin/yearly_backup09* *1-5mutt-sChecking inbossexample.com % Hi boss, just checking in.执行逻辑读取mycron文件内所有定时规则替换覆盖当前用户原有全部任务2. 配套练习完整逐行注释需求脚本/usr/local/bin/myjob后台计算md5、休眠20秒、杀死md5进程定时规则11月奇数日期11点~18点每2分钟执行一次步骤1 创建脚本[rootserver ~11:16:02]# vim /usr/local/bin/myjob脚本内容#!/bin/bashmd5sum /dev/zerosleep20pkillmd5sum逐行注释#!/bin/bash指定bash解释器运行脚本md5sum /dev/zeromd5sum计算文件md5哈希值/dev/zero系统无限零流文件后台运行不阻塞后续命令sleep 20程序暂停20秒pkill md5sum批量杀死所有md5sum后台进程# 给脚本添加执行权限否则定时任务无法运行[rootserver ~11:18:23]# chmod x /usr/local/bin/myjobchmod修改文件权限x增加执行权限步骤2 配置定时任务[rootserver ~11:21:22]# crontab -e# 写入规则*/211-18 */211* /usr/local/bin/myjob[rootserver ~11:22:35]# crontab -l*/211-18 */211* /usr/local/bin/myjob规则分段拆解*/2每2分钟执行一次11-18小时范围11点到18点*/2日期每隔2天 → 1、3、5、7…奇数号11仅11月份执行*星期无限制/usr/local/bin/myjob要执行的脚本完整路径步骤3 监控任务运行# 实时查看cron系统日志观察任务调度记录journalctl-f# top命令查看md5sum进程是否自动启动、20秒后自动销毁top三、系统周期性计划任务管理员全局任务所有用户共用核心作用用户crontab只能管理单个用户任务系统级定时任务是root全局配置可以指定任意用户执行系统自带每日/每周/每月自动任务目录适合服务器运维巡检、日志清理。 crond读取三处系统配置/etc/crontab全局主配置/etc/cron.d/自定义系统任务目录/etc/anacrontab关机错过任务开机补执行1. /etc/crontab 系统主定时文件[rootcentos7 ~]# cat /etc/crontabSHELL/bin/bashPATH/sbin:/bin:/usr/sbin:/usr/binMAILTOroot# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar# | | | | .---- day of week (0 - 6) 0周日# | | | | |# * * * * * user-name command头部全局变量逐行解释SHELL/bin/bash定时任务使用bash解释器执行命令PATH定时任务环境变量路径定时任务默认PATH很短命令尽量写全路径MAILTOroot任务输出内容自动发送邮件给root用户和用户crontab核心区别用户crontab格式分 时 日 月 周 命令系统/etc/crontab格式分 时 日 月 周 执行用户 命令多一段【执行用户】可以指定root、nginx、apache等任意用户运行任务2. /etc/cron.d 自定义系统任务目录作用自定义系统定时任务推荐放在这里系统更新不会覆盖文件[rootcentos7 ~]# ls /etc/cron.d0hourly raid-check sysstat[rootcentos7 ~]# cat /etc/cron.d/0hourlySHELL/bin/bashPATH/sbin:/bin:/usr/sbin:/usr/binMAILTOroot 01 * * * * root run-parts /etc/cron.hourly逐行解释01 * * * * root run-parts /etc/cron.hourly01每小时第1分钟执行*每日每月任意星期root使用root用户执行run-parts工具批量执行目录内所有可执行脚本/etc/cron.hourly每小时任务存放目录配套系统内置定时目录/etc/cron.hourly 每小时执行脚本/etc/cron.daily 每日执行脚本/etc/cron.weekly 每周执行脚本/etc/cron.monthly 每月执行脚本3. /etc/anacrontab 补执行定时任务关机补救作用普通crontab服务器关机时错过的任务不会执行anacron开机后自动补执行错过的每日/每周/每月任务适合服务器经常关机场景。 CentOS7统一由crond进程管理不需要单独启动anacron服务。[rootcentos7 ~]# cat /etc/anacrontabSHELL/bin/shPATH/sbin:/bin:/usr/sbin:/usr/binMAILTOrootRANDOM_DELAY45START_HOURS_RANGE3-22#间隔天数 延迟分钟 任务标识 执行命令15cron.dailynicerun-parts /etc/cron.daily725cron.weeklynicerun-parts /etc/cron.weekly monthly45cron.monthlynicerun-parts /etc/cron.monthly全局变量解释RANDOM_DELAY45任务启动随机延迟0~45分钟避免多台服务器同一时间执行任务造成压力START_HOURS_RANGE3-22任务仅在凌晨3点~22点之间运行深夜不执行任务4字段完整拆解间隔天数1每天7每周monthly每月延迟分钟开机后等待多久再执行任务分散服务器IO压力任务标识记录在/var/spool/anacron标记上次执行时间判断是否漏执行执行命令nice降低任务CPU优先级run-parts批量执行目录脚本