当前位置: 首页 > news >正文

解放双手!Linux 定时任务自动帮你跑脚本、备份数据

Linux 计划任务管理

一次性计划任务

一次性计划任务是指在未来某个时间点执行一个命令或一系列命令。

atd 服务

Linux 系统中at提供一次性计划任务功能。

at不是一个单独的工具,包括系统后台进程(atd)和一系列与后台进程atd交互的命令(例如at atq等等)。

# 使用以下命令安装[root@server ~13:47:56]# yum install at# 确认atd服务开机启动[root@server ~13:51:42]# systemctl status atd● atd.service - Job spooling tools Loaded: loaded(/usr/lib/systemd/system/atd.service;enabled;vendor preset: enabled)Active: active(running)since 三2026-07-2913:21:14 CST;30min ago Main PID:1164(atd)CGroup: /system.slice/atd.service └─1164 /usr/sbin/atd-f72913:21:14 server.cyw systemd[1]: Started Job spooling tools.

at 命令

语法:

at <timespec>

at命令从标准输入中读取要执行的命令。手动输入命令时,按ctrl+D完成输入。

示例:

[root@server ~13:54:30]# at now +5 minutesat>echohello world>/tmp/hello.log at><EOT>job1at Wed Jul2913:59:002026

输入完成,按ctrl+d完成。上面的字符’',就是按ctrl+d自动出现的。

如果输入错误,使用ctrl+backspace删除。

对于大量的命令或者错字敏感的命令,可以通过重定向和-f选项从脚本中读取,例如:

[root@server ~13:55:11]# vim myscript.sh#!/bin/bashdate>>/tmp/myscript.logechohello myscript>>/tmp/myscript.log[root@server ~13:57:40]# at now +5 minutes < myscript.shjob2at Wed Jul2914:03:002026[root@server ~13:58:24]# at now +100 minutes -f myscript.shjob3at Wed Jul2915:38:002026

timespec允许多种时间组合。例如,02:00 pm,15:43,或者teatime,后接日期或未来的天数。

示例:

  • now +5 hours
  • teatime tomorrow (teatime 16:00)
  • noon +4 days(noon 12:00)
  • 5 pm august 3 2016

时间定义参考文档 /usr/share/doc/at/timespec

at -l 或 atq

查看任务队列。

[root@server ~13:58:55]# at -l5Wed Jul2914:03:002026a root6Wed Jul2915:38:002026a root[root@server ~13:59:46]# atq5Wed Jul2914:03:002026a root6Wed Jul2915:38:002026a root

atd提供26个队列,a到z,排的越后优先级越低。使用at命令使用-q选项指定队列。

[root@server ~14:00:01]# at -q b now +5 minutes < myscript.shjob7at Wed Jul2914:05:002026[root@server ~14:00:36]# atq5Wed Jul2914:03:002026a root6Wed Jul2915:38:002026a root7Wed Jul2914:05:002026b root[root@server ~14:00:57]# at -l -q b7Wed Jul2914:05:002026b root# 时间到达后检测[root@server ~14:01:23]# atq[root@server ~14:01:54]# at /tmp/myscript.log
at -c

查看任务详细信息。

[root@server ~14:03:03]# at -c 7...${SHELL:-/bin/sh}<<'marcinDELIMITER6a45b022' #!/bin/bash date >> /tmp/myscript.log echo hello myscript >> /tmp/myscript.log marcinDELIMITER6a45b022
at -d/-r 或 atrm

删除任务。

[root@server ~14:04:11]# atq6Wed Jul2915:38:002026a root7Wed Jul2914:05:002026b root[root@server ~14:04:20]# atrm 6[root@server ~14:04:24]# atq7Wed Jul2914:05:002026b root

限定用户

/etc/at.allow 和 /etc/at.deny 控制哪些人可以使用atd服务。

匹配规则如下:

  1. 如果 /etc/at.allow 文件存在,只有该文件中提到的用户可以使用at服务。
  2. 如果/etc/at.allow文件不存在,只有/etc/at.deny文件中提到的用户禁止使用at服务。

查看当前配置:允许所有用户使用at服务。

[root@server ~14:04:31]# ls /etc/at.*/etc/at.deny[root@server ~14:04:50]# cat /etc/at.deny

用户周期性计划任务

周期性计划任务是指在未来的一些时间周期性地执行一个命令或一系列命令。

crond 服务

Linux 系统中cron 提供周期性计划任务功能。

cron包括系统后台进程(crond)、crontab 命令和多个配置文件。

用户可以使用 crontab 命令管理自己的周期性作业。

如果cron job运行的命令没有重定向 stdout 和 stderr,crond进程将通过邮件发送给job所有者。

crontab 命令

crontab -l

查看周期性计划任务。

[cyw@server ~14:37:32]$crontab-lnocrontabforcyw
crontab -e

该命令默认使用vi编辑周期性计划任务:

  • 可以申明环境变量,格式为name=value,将影响声明之后的所有行。crontab使用的常规环境变量有SHELL和MAILTO。发送邮件需要额外的配置:mail服务器和smtp。
  • 空行是允许的。
  • 以#开头的行是注释行。
  • 每一行是一个job。

默认编辑器可以通过EDITOR环境变量设定。

每一个jobs包涵6个部分:五个时间和一个要执行的命令,按以下顺序显示:

  • 分钟
  • 小时
  • 几号
  • 月份
  • 星期几
  • 命令

前五个字段全部使用相同的语法规则:

  • \*,表示“无关紧要”,始终。
  • 数字可用于指定分钟数或小时数、日期或者工作日。对于工作日,0表示星期日,1表示星期一,2表示星期二,依此类推。7也表示星期曰。
  • x-y:表示范围:x到y(含)。
  • x,y:表示列表。列表也可以包含范围,例如,5,10-13,17表示作业应当在每小时过去5分钟、10分钟、11分钟、12分钟、13分钟和17分钟后运行。
  • /x,表示x的时间间隔,例如列中的/7表示每七分钟运行一次作业。
  • 最后一个区域是要执行的命令,命令通过/bin/sh执行,除非指定SHELL变量。如果命令中包涵未转义字符%,则表示开启新行,并且%后面所有字符作为标准输入。

月和周区域可以使用三字母简写单词,Jan,Feb,Mar和Mon,Tue。

示例:

  • 以下作业将在每年2月2日上午9点准点执行命令/usr/local/bin/yearly_backup。
bash 0 9 2 2 * /usr/local/bin/yearly_backup
  • 以下作业将在七月每周五的上午9点和下午4点间,每五分钟向该作业的所有者发送包含单词Chime的电子邮件。
bash */5 9-16 * Jul 5 echo "Chime"
  • 以下作业将在每个工作日午夜前的两分钟运行命/usr/local/bin/daily_report。
bash 58 23 * * 1-5 /usr/local/bin/daily_report
  • 以下作业将在每个工作日(周一到周五)上午9点执行mutt命令,从而将邮件消息Checkingin发送给收件人boss@example.com。
bash 0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.

示例:

[cyw@server ~14:37:47]$exportEDITOR=vim[cyw@server ~14:38:35]$crontab-e*/22,6-23 * * *date>>/tmp/date.log[cyw@server ~14:40:03]$crontab-l*/22,6-23 * * *date>>/tmp/date.log# 监控日志[cyw@server ~14:40:22]$tail-f/tmp/date.log2026年 07月29日 星期三14:40:02 CST...
crontab -r

删除所有周期性计划任务。

[cyw@server ~14:40:57]$crontab-r[cyw@server ~14:41:18]$crontab-lnocrontabforcyw
crontab -u

root用户可以使用参数-u username管理其他用户周期性作业。

[root@server ~14:45:25]# crontab -u cyw -e0922* /usr/local/bin/yearly_backup09* *1-5mutt-s"Checking in"boss@example.com % Hi boss, just checking in.[root@server ~14:46:08]# crontab -u cyw -r[root@server ~14:46:39]# crontab -u cyw -lnocrontabforcyw
crontab filename

还可以使用crontab filename命令从文件filename中读取的作业并替换当前所有作业。

[cyw@server ~14:47:07]$vimmycron0922* /usr/local/bin/yearly_backup09* *1-5mutt-s"Checking in"boss@example.com % Hi boss, just checking in.[cyw@server ~14:48:00]$crontabmycron[cyw@server ~14:48:26]$crontab-l0922* /usr/local/bin/yearly_backup09* *1-5mutt-s"Checking in"boss@example.com % Hi boss, just checking in.
实践

编写一个简单的脚本/usr/local/bin/myjob

  1. 脚本内容要求如下: - 第一个命令 计算/dev/zero md5值:md5sum /dev/zero - 第二个命令 休息20秒: sleep 20 - 第三个命令 kill掉之前 的md5程序。
  2. 11月份奇数号11-18点之间,每隔2分钟执行一次。
# 1.开发脚本[root@server ~14:50:34]# vim /usr/local/bin/myjob#!/bin/bashmd5sum /dev/zero&sleep20pkillmd5sum[root@server ~14:51:01]# chmod +x /usr/local/bin/myjob# 2. 配置定时任务[root@server ~14:51:24]# crontab -e*/211-18 */211* /usr/local/bin/myjob[root@server ~14:52:02]# crontab -l*/211-18 */211* /usr/local/bin/myjob# 3. 监视任务执行journalctl-f监视cron执行top监视 md5sum 程序运行和终止

系统周期性计划任务

系统管理员使用配置文件定义系统周期性作业。crond守护进程会从多个配置文件中读取系统周期性计划作业:

  • /etc/crontab
  • /etc/cron.d/ 目录
  • /etc/anacrontab

/etc/crontab

crond的配置文件比crontab命令定义的jobs多一个区域,在最后一个时间和command之间,指明使用哪个账户执行job。

[root@server ~14:52:20]# cat /etc/crontabSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed

/etc/cron.d

系统周期性作业应始终在/etc/cron.d/目录中创建自定义crontab文件,防止cronie更新后覆盖/etc/crontab文件。其他应用也会将系统周期性作业存放在该目录。

/etc/cron.d/0hourly定义了每小时要执行的任务:run-parts /etc/cron.hourly

作用:每小时将/etc/cron.hourly目录下所有脚本按顺序执行一次。

[root@server ~14:53:05]# ls /etc/cron.d0hourly raid-check sysstat[root@server ~14:55:28]# cat /etc/cron.d/0hourly# Run the hourly jobsSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root 01 * * * * root run-parts /etc/cron.hourly

/etc/anacrontab

在过去,/etc/anacrontab 由单独的一个进程anacron处理,在CentOS 7 及后续版本中,这个文件也由 crond 进程处理,目的是确保重要的工作总是被执行,即使系统关机或者其他重大事故。

/etc/anacrontab定义了每天、每周、每个月要运行的任务。

周期性执行任务目录:

  • 每天要执行的任务目录:/etc/cron.daily

  • 每周要执行的任务目录:/etc/cron.weekly

  • 每月要执行的任务目录:/etc/cron.monthly

    [root@server ~ 18:35:25]# cat /etc/anacrontab # /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly

    /etc/anacrontab 使用语法NAME=value配置 anacrontab。

    例如,START_HOURS_RANGE=3-22,作业只能在此时间段运行。

    /etc/anacrontab 每行包涵4个区域:

    • period in days,按重复计划运行的作业的间隔天数。该字段接受整数或宏作为值。例如,宏@daily相当于整数1,它表示每天执行该作业。同样,宏@weekly相当于整数7,它表示每周执行该作业。
    • delay in minutes,在启动该作业前,crond守护进程应等待的时间。
    • job-identifier,此为/var/spool/anacron中的文件名称,用于检查该作业是否已运行。
    • command,要执行的命令。
http://www.cnnetsun.cn/news/3742707.html

相关文章:

  • 差分放大电路输出电压偏移原理与工程实现详解
  • 从原理到实战:共阳极数码管驱动、动态扫描与消影技术详解
  • TWEN-ASR ONE语音识别开发板入门:从零搭建环境到运行第一个程序
  • 5分钟极速部署OWASP Juice Shop:Docker与Node.js方案全解析
  • React createPortal 实战:模态框逃出 overflow:hidden、事件冒泡与焦点管理
  • AI 与传统文化融合的下半场:从娱乐到研究的方法论升级
  • 2026深度实测:16款降AIGC网站实测,闭眼入这款就对了!
  • 【单片机毕业设计推荐】基于 STM32 的人体健康监测与跌倒报警装置设计与实现,基于 STM32 的可穿戴运动健康监测终端及 WiFi 移动端系统设计(013304)
  • REFramework终极指南:5分钟为RE引擎游戏安装模组和脚本平台
  • Selenium模拟登录全攻略:从环境搭建到实战优化
  • 2026AI论文工具稀缺功能排行榜[特殊字符]真正有独家技术的只有OKBIYE
  • 7天从零构建RAG应用:LangChain+Ollama本地部署实战指南
  • FPGA入门:从原理图设计模60计数器理解数字电路底层原理
  • 文献表格工具怎么选?我把手头 60 篇 PDF 喂给三种方案实测了一遍(2026 实测版)
  • 毫米波多路功放怎么选?鼎讯信通 DXGF-228A 关键参数全解析
  • STM32硬件I2C驱动RM3100磁力计:从原理到稳定实现的完整指南
  • STM32内部FLASH存储与显示彩色图片的嵌入式优化实践
  • 二维字符数组与函数(声明、作用域、生存周期、存储)
  • 大模型上下文长度:原理、挑战与RAG等主流扩展方案详解
  • 3步完成QQ空间历史说说完整备份:GetQzonehistory开源工具终极指南
  • Python编程核心范式:从语法基础到实战项目的100个必背源码精解
  • 2026年静音舱各品牌深度拆解及前景应用
  • Kimi K3开源AI模型许可证政策解析与本地部署指南
  • STM32 ADC多通道采集与DMA应用:从单点到多维信号采集实战
  • FPGA矩阵乘法器设计:从Verilog实现到架构优化
  • Python-openpyxl高级操作
  • 基于51单片机的双通道波形发生器设计:从DAC原理到Proteus仿真
  • HarmonyOS 5.0.0 WebSocket 断线重连怎么写稳:前后台切换、网络变化和消息补偿怎么拆
  • 开源 AI 工具在前端工程中的现实可用性评估:成本、性能与定制化分析
  • 小龙虾Windows版OpenClaw 2026免费下载,配置详解