Linux 计划任务管理
一次性计划任务
一次性计划任务是指在未来某个时间点执行一个命令或一系列命令。
atd 服务
Linux 系统中at提供一次性计划任务功能。
at不是一个单独的工具,包括系统后台进程(atd)和一系列与后台进程atd交互的命令(例如at atq等等)。
# 使用以下命令安装
[root@server ~ 09:59:21]# yum install at
# 确认atd服务开机启动
[root@server ~ 10:00:06]# systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2025-11-11 10:00:06 CST; 8s ago
Main PID: 1276 (atd)
CGroup: /system.slice/atd.service
└─1276 /usr/sbin/atd -f
Nov 11 10:00:06 server systemd[1]: Started Job spooling tools.
at 命令
语法:
at <timespec>
at命令从标准输入中读取要执行的命令。手动输入命令时,按ctrl+D完成输入。
示例:
[root@server ~ 10:01:50]# at 10:05
at> date >> /var/log/at.log
at> echo "This is a job for at">> /var/log/at.log
at> <EOT>
job 1 at Tue Nov 11 10:05:00 2025
[root@server ~ 10:03:05]# at -l
1 Tue Nov 11 10:05:00 2025 a root
[root@server ~ 10:03:40]# at -c 1
[root@server ~ 10:05:03]# cat /var/log/at.log
Tue Nov 11 10:05:00 CST 2025
This is a job for at
[root@server ~ 17:20:03]# at now +1 minutes
at> echo hello world > /tmp/hello.log
at> <EOT>
job 7 at Tue Nov 11 17:21:00 2025
[root@server ~ 17:20:50]# at -l
7 Tue Nov 11 17:21:00 2025 a root
[root@server ~ 17:20:54]# cat /tmp/hello.log
hello world
输入完成,按ctrl+d完成。上面的字符’',就是安 ctrl+d 自动出现的。
如果输入错误,使用ctrl+backspace删除。
对于大量的命令或者错字敏感的命令,可以通过重定向和-f选项从脚本中读取,例如:
[root@server ~ 10:05:29]# vim myscript.sh
[root@server ~ 10:07:44]# cat myscript.sh
date >> /tmp/at.log
echo hello myscript >> /tmp/at.log
[root@server ~ 17:21:59]# at now +1 minutes < myscript.sh
job 8 at Tue Nov 11 17:23:00 2025
[root@server ~ 17:22:23]# at now +100 minutes -f myscript.sh
job 9 at Tue Nov 11 19:02:00 2025
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 ~ 17:22:48]# at -l
9 Tue Nov 11 19:02:00 2025 a root
[root@server ~ 17:24:43]# atq
9 Tue Nov 11 19:02:00 2025 a root
atd提供26个队列,a到z,排的越后优先级越低。使用at命令使用-q选项指定队列。
[root@server ~ 17:25:15]# at -q b now +5 minutes < myscript.sh
job 10 at Tue Nov 11 17:30:00 2025
[root@server ~ 17:25:35]# atq
9 Tue Nov 11 19:02:00 2025 a root
10 Tue Nov 11 17:30:00 2025 b root
[root@server ~ 17:25:42]# at -l -q b
10 Tue Nov 11 17:30:00 2025 b root
# 时间到达后检测,任务结束后自动删除
[root@server ~ 17:29:53]# atq
[root@server ~ 17:30:35]# cat /tmp/hello.log
hello world
[root@server ~ 17:30:09]# cat /tmp/at.log
Tue Nov 11 10:10:00 CST 2025
hello myscript
Tue Nov 11 17:23:00 CST 2025
hello myscript
Tue Nov 11 17:30:00 CST 2025
hello myscript
at -c
查看任务详细信息。
[root@server ~ 17:27:31]# at -c 9
......
${SHELL:-/bin/sh} << 'marcinDELIMITER4bf95eea'
${SHELL:-/bin/sh} << 'marcinDELIMITER0efeb6d2'
date >> /tmp/at.log
echo hello myscript >> /tmp/at.log
marcinDELIMITER0efeb6d2
at -d/-r 或 atrm
删除任务。
[root@server ~ 17:28:52]# atq
9 Tue Nov 11 19:02:00 2025 a root
10 Tue Nov 11 17:30:00 2025 b root
# 删除任务9
[root@server ~ 17:28:54]# atrm 9
# 删除后查询验证
[root@server ~ 17:29:05]# atq
10 Tue Nov 11 17:30:00 2025 b root
限定用户
/etc/at.allow 和 /et c/at.deny 控制哪些人可以使用atd服务。
匹配规则如下:
- 如果 /etc/at.allow 文件存在,只有该文件中提到的用户可以使用at服务。
- 如果/etc/at.allow文件不存在,只有/etc/at.deny文件中提到的用户禁止使用at服务。
查看当前配置:允许所有用户使用at服务。
[root@server ~ 17:30:57]# ls /etc/at.*
/etc/at.deny
[root@server ~ 17:53:38]# cat /etc/at.deny
用户周期性计划任务
周期性计划任务是指在未来的一些时间周期性地执行一个命令或一系列命令。
crond 服务
Linux 系统中cron 提供周期性计划任务功能。
cron包括系统后台进程(crond)、crontab 命令和多个配置文件。
用户可以使用 crontab 命令管理自己的周期性作业。
如果cron job运行的命令没有重定向 stdout 和 stderr,crond进程将通过邮件发送给job所有者。
crontab 命令
[root@server ~ 10:18:41]# vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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
crontab -l
查看周期性计划任务。
[root@server ~ 17:53:51]# crontab -l
no crontab for root
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。
0 9 2 2 * /usr/local/bin/yearly_backup -
以下作业将在七月每周五的上午9点和下午4点间,每五分钟向该作业的所有者发送包含单词Chime的电子邮件。
*/5 9-16 * Jul 5 echo "Chime" -
以下作业将在每个工作日午夜前的两分钟运行命/usr/local/bin/daily_report。
58 23 * * 1-5 /usr/local/bin/daily_report -
以下作业将在每个工作日(周一到周五)上午9点执行mutt命令,从而将邮件消息Checkingin发送给收件人boss@example.com。
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.
示例:
[root@server ~ 10:20:52]# export EDITOR=vim
[root@server ~ 18:21:12]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@server ~ 18:21:49]# crontab -l
*/2 2,3-23 * * * date >> /tmp/date.log
# 监控日志
[root@server ~ 18:21:55]# tail -f /tmp/date.log
Tue Nov 11 18:22:01 CST 2025
......
crontab -r
删除所有周期性计划任务。
[shizhan@server ~ 18:23:44]$ crontab -r
[shizhan@server ~ 18:23:56]$ crontab -l
no crontab for shizhan
crontab -u
root用户可以使用参数 -u username 管理其他用户周期性作业。
[root@server ~ 15:26:30]# crontab -u shizhan -l
0 9 2 2 * /usr/local/bin/yearly_backup
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.
[root@server ~ 18:25:10]# crontab -u shizhan -r
[root@server ~ 18:25:24]# crontab -u shizhan -l
no crontab for shizhan
crontab filename
还可以使用crontab filename 命令从文件 filename 中读取的作业并替换当前所有作业。
[shizhan@server ~ 18:24:48]$ vim mycron
0 9 2 2 * /usr/local/bin/yearly_backup
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.
[shizhan@server ~ 18:26:09]$ crontab mycron
[shizhan@server ~ 18:26:26]$ crontab -l
0 9 2 2 * /usr/local/bin/yearly_backup
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.
系统周期性计划任务
系统管理员使用配置文件定义系统周期性作业。crond守护进程会从多个配置文件中读取系统周期性计划作业:
- /etc/crontab
- /etc/cron.d/ 目录
- /etc/anacrontab
/etc/crontab
crond的配置文件比crontab命令定义的jobs多一个区域,在最后一个时间和command之间,指明使用哪个账户执行job。
[root@server ~ 18:25:26]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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 ~ 18:32:27]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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:15]# 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,要执行的命令。
案例
要求
编写一个简单的脚本/usr/local/bin/myjob
脚本内容要求如下:
第一个命令 用于计算/dev/zero md5值:md5sum /dev/zero
第二个命令 休息20秒: sleep 20
第三个命令 kill掉之前 计算/dev/zero md5值程序。
11月份奇数号11-23点之间,每隔2分钟执行一次。
实现过程
- 开发脚本
[root@server ~ 18:35:29]# vim /usr/local/bin/myjob
[root@server ~ 18:47:24]# cat /usr/local/bin/myjob
#!/bin/bash
md5sum /dev/zero &
sleep 20
pkill md5sum
[root@server ~ 18:47:40]# chmod u+x /usr/local/bin/myjob
- 配置定时任务
[root@server ~ 18:48:13]# crontab -e
crontab: installing new crontab
[root@server ~ 18:49:14]# crontab -l
*/2 11-23 */2 11 * /usr/local/bin/myjob
- 监视任务执行
journalctl -f 命令监视 cron 任务的执行
top 命令监视 md5sum 程序运行和终止

987

被折叠的 条评论
为什么被折叠?



