计划任务原理及实战
计划任务
1、一次性计划任务
什么时间+做什么任务
at 命令的特点:
• 一次性任务: at 命令用于安排一次性任务,任务执行一次后即结束。
• 精确时间执行:任务会在指定的确切时间执行,如果系统在该时间未运行,则任务不会执行。
• 不支持补执行:与 crontab 不同, at 不会在系统启动后检查并执行之前错过的时间点的任务.
通过那个程序来实现?atd
atd 是
at守护进程,它在系统后台运行,负责监控at队列并执行到达预定时间的任务。

#查找命令由哪个软件包提供
[root@localhost ~]# yum whatprovides */at
[root@class2 ~]# yum install at-3.1.23-11.el9.x86_64
#查看软件版本
[root@localhost ~]# at -V
#查看服务名字
[root@localhost ~]# rpm -ql at
/usr/lib/systemd/system/atd.service
1、一般实现
at [HH:MM] [yyyy-mm-dd] #设置计划任务
-l:列出系统上所有用户的at任务,等价于atq
-d:删除或取消一个任务
-v:使用时间格式,列出at任务
-c:可以列出任务之后的命令内容
-f:从文件中读取
Linux at 命令解析
at命令(Linux一次性定时任务工具)解析
at命令用于在Linux系统中执行一次性定时任务,与周期性执行的cron任务不同,适合仅需运行一次的场景。以下是对图片中命令的解读:
- echo “echo ‘Hello, World!’” | at now + 5 minutes
- 作用:通过管道将待执行命令传给at,设定在当前时间+5分钟后执行echo ‘Hello, World!’(终端输出“Hello, World!”)。
- 时间格式:now + 5 minutes是相对时间表示,类似的还有now + 1 hour(1小时后)、now + 2 days(2天后)等。
- at -f /file midnight
- 作用:通过-f选项指定脚本文件/file,设定在**午夜(midnight)**执行该脚本中的任务。
- 场景:适用于任务逻辑复杂(多命令组合)的情况,将命令写入脚本文件后调度。
- at 10:44 + 交互命令ls -al ~ | tee /a.txt
- 作用:设定在10:44执行任务,进入at交互模式后,执行ls -al ~(列出家目录所有文件的详细信息,含隐藏文件),并通过tee将结果同时输出到终端和写入/a.txt文件。
- 交互模式:输入at 时间后进入at>提示符界面,输入命令后按Ctrl+D保存任务。
补充说明
at命令时间表示灵活,支持相对时间、绝对时间(如10:44、noon)、日期格式(如2025-10-22 09:00)。查看已设定任务用atq,删除任务用atrm 任务编号(任务编号通过atq查看)。
#设定任务
[root@server ~]# echo "echo Hello, World!" | at now + 5 minutes
[root@server ~]# at -f /file midnight
[root@localhost ~]# at 10:44
warning: commands will be executed using /bin/sh
at> ls -al ~ |tee /a.txt
at> <EOT> #ctrl d 生成任务
job 1 at Sun Jan 5 10:44:00 2025#修改任务的执行时间和任务内容:
删除任务、重新创建
#查看任务有哪些
at -l
atq
#查看任务的具体内容
at -c 14
#删除任务
atrm 1
at -d 5
#查看系统是否执行
tail -f /var/log/cron
watch -n 1 ls -l /root
---------------------------
方法1:交互式设置计划任务
[root@localhost ~]# at 4:30 2025-01-08
warning: commands will be executed using /bin/shat> echo 124 > /xixhaha
at> <EOT>
job 3 at Wed Jan 8 04:30:00 2025#列出计划任务
[root@localhost ~]# at -l
2 Tue Jan 7 11:14:00 2025 a root
3 Wed Jan 8 04:30:00 2025 a root
#查看计划任务里面的内容
[root@localhost ~]# at -c 2
#删除任务
[root@localhost ~]# atrm 31、计划任务保存在目录: /var/spool/at
2、计划任务的日志:/var/log/cron注意:如果执行的任务需要终端显示,那么该任务的不会输出在标准输出
方法2:非交互式-文件
[root@localhost ~]# cat /file1
ls -a /root > /file.txt
ls /
[root@localhost ~]# at -f /file1 now +1 min
warning: commands will be executed using /bin/sh
job 5 at Mon Jan 6 11:31:00 2025
注意:
at命令的输出结果(标准输出和标准错误输出)不会显示到屏幕上
at命令中执行的命令最好使用绝对路径,不容易报错
过程:输入at 时间 -> 回车 ->输入执行的命令->ctrl+d退出at
at命令只会执行一次,时间过了就不再执行
2、时间的书写格式
#1、指定时间
am、pm 12小时制
HH:MM 24小时制
年月日 06122024 2024-12-06 12/06/2024 06.12.2024MMDD[CC]YY [CC]YY-MM-DD. MM/DD/[CC]YY DD.MM.[CC]YY [HH:MM] [yyyy-mm-dd]
#2、模糊时间
noon(12:00) midnight(00:00) teatime(4pm)
#3、相对时间
now +1 min now +2 days
要在三天后的下午4点运行作业,您可以使用 at 4pm + 3 days
要在7月31日上午10点运行作业,您可以使用 at 10am Jul 31
要在明天的凌晨1点运行作业,您可以使用 at 1am tomorrow
#在指定终端打印消息:haha,ni bei hei le !!!
3、黑白名单
超级用户可以在任何情况下使用这些命令。对于其他用户,使用 at 的权限由文件 /etc/at.allow 和 /etc/at.deny 确定
1、格式:每行一个用户名称,不允许有空白字符
2、系统先检测at.allow,如果at.allow存在,其中的用户允许at,即使at.deny也存在该用户也会被忽略
3、如果at.allow不存在才检测at.deny,其中用户不允许at,剩下的用户可使用at
4、at.allow at.deny 都不存在,只有root可用at
4、注意点
权限:不同用户对系统的使用权限不一样
注意:设置任务的时候,该任务的一定要在该用户的权限范围之内
[redhat@localhost ~]$ touch /root/1234
touch: 无法创建 '/root/1234': 权限不够[redhat@localhost ~]$ at now +1 min
warning: commands will be executed using /bin/sh
at> touch /root/1234
at> <EOT>
job 11 at Mon Jan 6 11:47:00 2025
[redhat@localhost ~]$ at -l
11 Mon Jan 6 11:47:00 2025 a redhat
效果:显示任务11已被执行,但是该文件/root/1234实际不存在
[root@localhost ~]# ll /root/1234
ls: 无法访问 '/root/1234': 没有那个文件或目录
[root@localhost ~]# tail /var/log/cron
Jan 6 11:47:00 localhost atd[36090]: Starting job 11 (a0000b01b985a3) for user 'redhat' (1000)
练习:
1、在未来的1分钟在/创建一个文件
2、在10点20分时在所有终端打印显示XXXXXXXXXXXXXXXXXX
3、今天下午14:30列出当前目录的内容,并且将内容放到a.txt文件
2、周期性计划任务
未来每天/周/月 + 做什么任务
时间+任务
通过那个程序来实现?crond
crontab /etc/crontab
cron守护进程(crond)在系统后台运行,负责检查crontab`文件以确定哪些任务需要运行
1、一般实现
#找程序、程序的配置文件
[root@server ~]# systemctl status crond.service
[root@localhost ~]# rpm -ql cron
cronie cronie-anacron crontabs
[root@localhost ~]# rpm -ql crontabs
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/crontab
/etc/sysconfig/run-parts
/usr/bin/run-parts
/usr/share/licenses/crontabs
/usr/share/licenses/crontabs/COPYING
/usr/share/man/man4/crontabs.4.gz
/usr/share/man/man4/run-parts.4.gz#设定任务
方法1:/etc/crontab
系统的 crontab 文件,由crond进程管理方法2: crontab -e -u root
以root身份添加计划任务,并以用户的身份命名的文件保存在/var/spool/cron/目录下
[root@class2 ~]# ll /var/spool/cron/
总用量 8
-rw-------. 1 redhat redhat 44 10月 18 11:38 redhat
-rw-------. 1 root root 41 10月 18 11:31 root
[root@class2 ~]# cat /var/spool/cron/redhat
* * * * * tree > /home/redhat/file.con[root@class2 ~]# cat /var/spool/cron/root
* * * * * echo "`date`" >> /file.cron[root@localhost ~]# crontab -e #可以语法检查
[root@localhost ~]# crontab -u redhat -ecrontab -l:列出当前用户的 crontab 文件内容。
crontab -r:删除当前用户的 crontab 文件。
[root@localhost ~]# ll /var/spool/cron/
总用量 4
-rw-------. 1 root root 41 10月 13 11:02 redhat
[root@localhost ~]# cat /var/spool/cron/redhat
* 11 * * * touch /home/redhat/file333
#修改任务的执行时间和任务内容:
crontab -e
#查看任务有哪些
crontab -l
#默认查看root用户的周期任务
[root@localhost ~]# crontab -l
* * * * * touch /file111111111111111
#查看指定用户的周期任务
[root@localhost ~]# crontab -l -u redhat
* 11 * * * touch /home/redhat/file333
[root@localhost ~]#
#查看系统周期任务的具体内容
cat /etc/crontab
注意:查看系统周期任务只能查看该文件,crontab -l是查看用户周期任务
#删除指定用户的周期任务
[root@localhost ~]# crontab -r -u redhat
[root@localhost ~]# crontab -l -u redhat
no crontab for redhat
#删除root用户的周期任务
[root@localhost ~]# crontab -r
[root@localhost ~]# crontab -l
no crontab for root方法3:包含为不同用户存储的不同类别的任务,系统定时任务的目录,由crond进程管理
/etc/cron.d/
创建一个名为 nginx_maintenance的文件,放在/etc/cron.d/目录下,可以清晰地知道该文件是用于 nginx 服务的维护任务,并且能够快速地找到和修改相关的定时任务配置。
[root@localhost ~]# /etc/cron.d/nginx_maintenance
# 清理旧的日志文件,每周执行一次
0 2 * * 7 root /usr/local/bin/cleanup_nginx_logs.sh
# 检查配置文件的完整性,每天执行一次
0 1 * * * root /usr/local/bin/check_nginx_config.sh#crontab执行的每一项工作都会被记录到日志:/var/log/cron
tail -f /var/log/cron%需要转义
[root@localhost ~]# tail -n 1 /etc/crontab
* 10 * * * root echo 123 > "/file1_`date +\%R`"
2、时间的书写格式
#特殊符号
*:代表指定时间单位中的每一个时刻。例如,*在分钟字段中表示每分钟。
,:用于分隔列表中的项目。例如,1,3,5 * * * * command 表示每个小时的第1、3、5分钟执行命令。
-:用于定义范围。例如,0 9-17 * * * command 表示从早上9点到下午5点每小时开始时执行命令。
/数字:用于指定步长。例如,*/15 * * * * command 表示每15分钟执行一次命令。分 时 日 月 周
*/2 */2 */2 */2 *
* * * * */2
* * L 1-6/2 *
* * * * 2
* 8 * * * 每天8点的每一分钟
0 8 * * * 每天8:00执行
13 0 1 * * 每月1日00:13执行
*/2 12 * * * 每天12点每两分钟执行
* 11,23 * * * 每天11点和23点的每一分钟都 执行
* 1-3 * * * 每天的1点、2点、3点的每一分钟都执行
#特殊情况:2025年1月5日是星期日,当日期和星期冲突的时候,那么这天和这个星期都会执行,是与关系
* 11 3 1 7 root wall hahahaha
* 11 5 1 6 root wall xixixixxi#练习:每月5,10,15,20号 ,在凌晨0点-6点之间每隔两个小时执行
* 0-6/2 5-20/5 * *
* 0,2,4,6 5,10,15,20 * ** * * * *
分 时 日 月 周31 2
#请问如果是每年2月31日执行某任务吗?
由于日期不存在,所以任务不会运行
#如果您想在每年的2月最后一天凌晨2点执行任务
* * L 2 *
每年的二月最后一天,每个小时的每分钟,无论星期几
#如果日期和周对不上怎么办?
* * L 2 7 表示每个月的2月最后一天(L)并且是星期日(7)时执行任务。每天凌晨1点执行备份脚本:
0 1 * * * /path/to/backup/script.sh
每周一下午4点执行某个任务:
0 16 * * 1 /path/to/weekly/script.sh
每隔10分钟执行一个监控脚本(仅作为示例,实际中可能不推荐如此频繁的执行):
*/10 * * * * /path/to/monitoring/script.sh11 11 * * * echo hello #每天11点11分执行echo hello# anacron 能够在系统启动后自动执行定期任务,即使系统在任务预定时间未运行,任务也会在系统下次启动时执行.
[root@localhost ~]# rpm -ql cronie-anacron
/etc/anacrontab
3、黑白名单
/etc/cron.allow/etc/cron.deny `
cron.allow和cron.deny文件不能用于限制cron的执行;它们只限制crontab的使用。特别是,限制访问crontab对用户的现有crontab没有影响。其工作将继续直到crontab被删除。
调用crontab的用户必须能够读取cron.allow和cron.deny文件。如果不是这样,那么它们就被视为不存在。当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用crontab 命令。
同样,如果有此/etc/cron.allow文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高
当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令crontab 执行的每一项工作都会被 记录到 /var/log/cron 这个日志文件中
当用户使用 crontab 新建工作之后,该项工作就会被记录到 /var/spool/cron/目录里面
4、扩展:run-parts
run-parts:该命令可将后面接的“目录”内的所有文件找出来执行。
#步骤1:假设我们有一个名为 scripts 的目录,其中包含以下可执行脚本:
/scripts/
├── script1.sh
├── script2.sh
└── script3.sh
我们想要在每天的凌晨 1 点执行这些脚本。我们可以这样做:
#步骤2:首先,确保脚本有执行权限。
chmod +x /scripts/*.sh#步骤3:设置周期性任务
[root@localhost ~]# vim /etc/crontab
在打开的编辑器中,添加以下行:
01 * * * * run-parts /scripts
保存并退出编辑器。[root@localhost ~]# mkdir /shell
[root@localhost ~]# vim /shell/1.sh
[root@localhost ~]# vim /shell/2.sh
[root@localhost ~]# vim /shell/3.sh
[root@localhost ~]# chmod u+x /shell/*
[root@localhost ~]# vim /etc/crontab
* 11 * * * root run-parts /shell #注意/shell 是目录
#日志追踪
tail -f /var/log/cron
5、练习
#让 john 用户在指定的时间范围内执行 check.sh 脚本,你可以这样写:
0 11-17 * * * john /check.sh#每两个小时执行一次而且是在凌晨0点-6点之间,每月5,10,15,20去执行0 0-6/2 5-20/5 * *
#每周一,周三,周日,凌晨2-6点,每隔30分钟执行一个操作 echo "backup" >> /root/cron_back0,30 2-6 * * 1,3,7 echo "backup" >> /root/cron_back
补充1:

- crond服务状态(上半部分)
- 服务标识:crond.service - Command Scheduler 表明这是Linux的定时任务调度服务。
- 运行状态:loaded(已加载配置)、enabled(开机自启)、active (running)(当前运行中),说明crond服务正常启动且持续运行。
- 关键参数:
- Main PID: 1025 (crond):crond进程的进程ID为1025;
- Memory: 1.1M、CPU: 53ms:服务资源占用极低,属于轻量级守护进程。
- cron日志(下半部分)
日志记录了crond的启动和任务执行过程:
- 启动信息:(CRON) STARTUP (1.5.7) 表示crond守护进程以1.5.7版本启动;Syslog will be used instead of sendmail 说明任务输出将通过系统日志(syslog)记录,而非邮件(sendmail)发送。
- 任务执行:run-parts /etc/cron.hourly 是系统每小时自动执行的任务目录,截图中记录了对/etc/cron.hourly下0anacron脚本的启动(starting 0anacron)和完成(finished 0anacron),表明每小时任务已正常执行。
补充2:
systemctl status nginx &> /nginx
这是一条用于查看Nginx服务状态并将输出重定向到文件的Linux命令,以下是分点解读:
- 命令核心:systemctl status nginx
- 功能:用于查询nginx服务的运行状态(如是否启动、进程ID、启动时间等)。
- 背景:systemctl是Systemd系统的服务管理工具,用于管理Linux系统的守护进程、服务的启动、停止、状态查询等。
- 重定向部分:1&>2 /nginx
- 语法说明:
- 1代表标准输出(stdout),2代表标准错误(stderr);
- 作用是将所有输出(标准输出+标准错误)写入/nginx文件;
- 效果:执行命令后,systemctl status nginx的所有输出(包括服务状态信息、可能的错误提示)都会被保存到根目录下的nginx文件中,而非直接在终端显示。
补充3:
touch /file_`date +%D`
- 功能:创建一个以“当前日期(月/日/年格式)”命名的文件。
- 原理:
- 反引号 date +%D 执行date +%D命令,%D是Linuxdate命令的格式符,代表“月/日/年”(如10/22/25);
- touch命令用于创建空文件,最终会生成类似/file_10/22/25的文件(文件名包含当前日期)。
- 注:%D中的反斜杠是为了防止shell对%符号的特殊解析,确保date命令能正确识别格式符。
