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

计划任务原理及实战

计划任务

1、一次性计划任务

什么时间+做什么任务

at 命令的特点:

• 一次性任务: at 命令用于安排一次性任务,任务执行一次后即结束。

• 精确时间执行:任务会在指定的确切时间执行,如果系统在该时间未运行,则任务不会执行。

• 不支持补执行:与 crontab 不同, at 不会在系统启动后检查并执行之前错过的时间点的任务.

通过那个程序来实现?atd

atdat守护进程,它在系统后台运行,负责监控at队列并执行到达预定时间的任务。

1728724965118

#查找命令由哪个软件包提供
[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任务不同,适合仅需运行一次的场景。以下是对图片中命令的解读:

  1. 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天后)等。
  1. at -f /file midnight
  • 作用:通过-f选项指定脚本文件/file,设定在**午夜(midnight)**执行该脚本中的任务。
  • 场景:适用于任务逻辑复杂(多命令组合)的情况,将命令写入脚本文件后调度。
  1. 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 1018 11:38 redhat
-rw-------. 1 root   root   41 1018 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 1013 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:
在这里插入图片描述

  1. crond服务状态(上半部分)
  • 服务标识:crond.service - Command Scheduler 表明这是Linux的定时任务调度服务。
  • 运行状态:loaded(已加载配置)、enabled(开机自启)、active (running)(当前运行中),说明crond服务正常启动且持续运行。
  • 关键参数:
    • Main PID: 1025 (crond):crond进程的进程ID为1025;
    • Memory: 1.1M、CPU: 53ms:服务资源占用极低,属于轻量级守护进程。
  1. 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命令,以下是分点解读:

  1. 命令核心:systemctl status nginx
  • 功能:用于查询nginx服务的运行状态(如是否启动、进程ID、启动时间等)。
  • 背景:systemctl是Systemd系统的服务管理工具,用于管理Linux系统的守护进程、服务的启动、停止、状态查询等。
  1. 重定向部分: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命令能正确识别格式符。
http://www.dtcms.com/a/515690.html

相关文章:

  • 做网站设计最好的公司做旅游网站的论文
  • 【Android】Handler/Looper机制相关的类图和流程图
  • ARM《1》_回顾gcc、动态编译和静态编译、MakeFile的使用
  • 网络环路:隐形威胁的破解之道
  • stm32 can错误中断不处理
  • 我们平常说的连网是指什么?
  • 网站优化人员新乡市延津县建设局网站
  • 网站建设分析从哪几个方面东莞市招聘网
  • 设计模式-责任链模式:从鞋厂审批流程看请求处理的艺术
  • 21_AI智能体开发架构搭建之基于Flask蓝图模块化构建可扩展的知识库服务实践
  • 【手机篇】AI深度学习在手机摄像头模组支架外观检测应用方案
  • 手机版矩阵系统源码搭建与定制开发:深度技术解析与落地实践
  • 做网站首页可以用传媒公司吗软件 项目管理系统
  • 舟山建设工程信息网站北京设计公司招聘
  • Elasticsearch还有哪些常用的分词器?
  • 使用CNN构建VAE
  • TESOLLO:使用MANUS Franka机械臂提高机器人灵活性
  • 西宁建设网站软件陕西交通建设有限公司网站
  • COMAU柯马焊接机器人气保焊省气
  • 西门子 1500 PLC 依托 Ethernet/ip 转 Modbus RTU联合发那科机器人优化生产流程
  • 全球首个超声多模态大模型!百度百舸支撑海豚智能实现高效训练与稳定服务
  • 统一机器人描述格式---URDF
  • SCARA 机器人点到点(PTP)轨迹规划方法
  • 岳阳市网站建设推广搜索引擎优化是什么?
  • 阿里云代理商:阿里云负载均衡是什么?
  • 安川机器人motoplus二次开发实现socket 变量读写 SKILLSND命令接收 轨迹实时修正功能
  • 社交网站 备案wordpress硬件接口
  • Redis未授权访问漏洞:从原理到高级利用
  • 项目实践3—全球证件智能识别系统(Qt客户端开发+FastAPI后端人工智能服务开发)
  • 【LeetCode】87. 扰乱字符串