解放双手!Linux 定时任务自动帮你跑脚本、备份数据 Linux 计划任务管理一次性计划任务一次性计划任务是指在未来某个时间点执行一个命令或一系列命令。atd 服务Linux 系统中at提供一次性计划任务功能。at不是一个单独的工具包括系统后台进程atd和一系列与后台进程atd交互的命令例如at atq等等。# 使用以下命令安装[rootserver ~13:47:56]# yum install at# 确认atd服务开机启动[rootserver ~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-f7月2913:21:14 server.cyw systemd[1]: Started Job spooling tools.at 命令语法at timespecat命令从标准输入中读取要执行的命令。手动输入命令时按ctrlD完成输入。示例[rootserver ~13:54:30]# at now 5 minutesatechohello world/tmp/hello.log atEOTjob1at Wed Jul2913:59:002026输入完成按ctrld完成。上面的字符’就是按ctrld自动出现的。如果输入错误使用ctrlbackspace删除。对于大量的命令或者错字敏感的命令可以通过重定向和-f选项从脚本中读取例如[rootserver ~13:55:11]# vim myscript.sh#!/bin/bashdate/tmp/myscript.logechohello myscript/tmp/myscript.log[rootserver ~13:57:40]# at now 5 minutes myscript.shjob2at Wed Jul2914:03:002026[rootserver ~13:58:24]# at now 100 minutes -f myscript.shjob3at Wed Jul2915:38:002026timespec允许多种时间组合。例如02:00 pm15:43或者teatime后接日期或未来的天数。示例now 5 hoursteatime tomorrow (teatime 16:00)noon 4 days(noon 12:00)5 pm august 3 2016时间定义参考文档 /usr/share/doc/at/timespecat -l 或 atq查看任务队列。[rootserver ~13:58:55]# at -l5Wed Jul2914:03:002026a root6Wed Jul2915:38:002026a root[rootserver ~13:59:46]# atq5Wed Jul2914:03:002026a root6Wed Jul2915:38:002026a rootatd提供26个队列a到z排的越后优先级越低。使用at命令使用-q选项指定队列。[rootserver ~14:00:01]# at -q b now 5 minutes myscript.shjob7at Wed Jul2914:05:002026[rootserver ~14:00:36]# atq5Wed Jul2914:03:002026a root6Wed Jul2915:38:002026a root7Wed Jul2914:05:002026b root[rootserver ~14:00:57]# at -l -q b7Wed Jul2914:05:002026b root# 时间到达后检测[rootserver ~14:01:23]# atq[rootserver ~14:01:54]# at /tmp/myscript.logat -c查看任务详细信息。[rootserver ~14:03:03]# at -c 7...${SHELL:-/bin/sh}marcinDELIMITER6a45b022 #!/bin/bash date /tmp/myscript.log echo hello myscript /tmp/myscript.log marcinDELIMITER6a45b022at -d/-r 或 atrm删除任务。[rootserver ~14:04:11]# atq6Wed Jul2915:38:002026a root7Wed Jul2914:05:002026b root[rootserver ~14:04:20]# atrm 6[rootserver ~14:04:24]# atq7Wed Jul2914:05:002026b root限定用户/etc/at.allow 和 /etc/at.deny 控制哪些人可以使用atd服务。匹配规则如下如果 /etc/at.allow 文件存在只有该文件中提到的用户可以使用at服务。如果/etc/at.allow文件不存在只有/etc/at.deny文件中提到的用户禁止使用at服务。查看当前配置允许所有用户使用at服务。[rootserver ~14:04:31]# ls /etc/at.*/etc/at.deny[rootserver ~14:04:50]# cat /etc/at.deny用户周期性计划任务周期性计划任务是指在未来的一些时间周期性地执行一个命令或一系列命令。crond 服务Linux 系统中cron 提供周期性计划任务功能。cron包括系统后台进程crond、crontab 命令和多个配置文件。用户可以使用 crontab 命令管理自己的周期性作业。如果cron job运行的命令没有重定向 stdout 和 stderrcrond进程将通过邮件发送给job所有者。crontab 命令crontab -l查看周期性计划任务。[cywserver ~14:37:32]$crontab-lnocrontabforcywcrontab -e该命令默认使用vi编辑周期性计划任务可以申明环境变量格式为namevalue将影响声明之后的所有行。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变量。如果命令中包涵未转义字符%则表示开启新行并且%后面所有字符作为标准输入。月和周区域可以使用三字母简写单词JanFebMar和MonTue。示例以下作业将在每年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发送给收件人bossexample.com。bash 0 9 * * 1-5 mutt -s Checking in bossexample.com % Hi boss, just checking in.示例[cywserver ~14:37:47]$exportEDITORvim[cywserver ~14:38:35]$crontab-e*/22,6-23 * * *date/tmp/date.log[cywserver ~14:40:03]$crontab-l*/22,6-23 * * *date/tmp/date.log# 监控日志[cywserver ~14:40:22]$tail-f/tmp/date.log2026年 07月29日 星期三14:40:02 CST...crontab -r删除所有周期性计划任务。[cywserver ~14:40:57]$crontab-r[cywserver ~14:41:18]$crontab-lnocrontabforcywcrontab -uroot用户可以使用参数-u username管理其他用户周期性作业。[rootserver ~14:45:25]# crontab -u cyw -e0922* /usr/local/bin/yearly_backup09* *1-5mutt-sChecking inbossexample.com % Hi boss, just checking in.[rootserver ~14:46:08]# crontab -u cyw -r[rootserver ~14:46:39]# crontab -u cyw -lnocrontabforcywcrontab filename还可以使用crontab filename命令从文件filename中读取的作业并替换当前所有作业。[cywserver ~14:47:07]$vimmycron0922* /usr/local/bin/yearly_backup09* *1-5mutt-sChecking inbossexample.com % Hi boss, just checking in.[cywserver ~14:48:00]$crontabmycron[cywserver ~14:48:26]$crontab-l0922* /usr/local/bin/yearly_backup09* *1-5mutt-sChecking inbossexample.com % Hi boss, just checking in.实践编写一个简单的脚本/usr/local/bin/myjob脚本内容要求如下 - 第一个命令 计算/dev/zero md5值md5sum /dev/zero - 第二个命令 休息20秒 sleep 20 - 第三个命令 kill掉之前 的md5程序。11月份奇数号11-18点之间每隔2分钟执行一次。# 1.开发脚本[rootserver ~14:50:34]# vim /usr/local/bin/myjob#!/bin/bashmd5sum /dev/zerosleep20pkillmd5sum[rootserver ~14:51:01]# chmod x /usr/local/bin/myjob# 2. 配置定时任务[rootserver ~14:51:24]# crontab -e*/211-18 */211* /usr/local/bin/myjob[rootserver ~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/crontabcrond的配置文件比crontab命令定义的jobs多一个区域在最后一个时间和command之间指明使用哪个账户执行job。[rootserver ~14:52:20]# cat /etc/crontabSHELL/bin/bashPATH/sbin:/bin:/usr/sbin:/usr/binMAILTOroot# 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) (Sunday0 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目录下所有脚本按顺序执行一次。[rootserver ~14:53:05]# ls /etc/cron.d0hourly raid-check sysstat[rootserver ~14:55:28]# cat /etc/cron.d/0hourly# Run the hourly jobsSHELL/bin/bashPATH/sbin:/bin:/usr/sbin:/usr/binMAILTOroot 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[rootserver ~ 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 MAILTOroot # the maximal random delay added to the base delay of the jobs RANDOM_DELAY45 # the jobs will be started during the following hours only START_HOURS_RANGE3-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 使用语法NAMEvalue配置 anacrontab。例如START_HOURS_RANGE3-22作业只能在此时间段运行。/etc/anacrontab 每行包涵4个区域period in days按重复计划运行的作业的间隔天数。该字段接受整数或宏作为值。例如宏daily相当于整数1它表示每天执行该作业。同样宏weekly相当于整数7它表示每周执行该作业。delay in minutes在启动该作业前crond守护进程应等待的时间。job-identifier此为/var/spool/anacron中的文件名称用于检查该作业是否已运行。command要执行的命令。