Linux下的at命令与crontab:自动化例行与周期性任务管理

发布时间:2025-02-10 04:12

Linux基础:命令行操作和系统管理 #生活技巧# #工作学习技巧# #编程语言学习路径#

华子目录 例行性工作(计划任务)单一执行的例行性任务---at(一次性)安装at命令详解时间格式 at命令执行过程分析 `at`基本语法常用选项使用示例注意事项 循环执行的例行性任务---crontab(周期性)crond服务crontab工作过程crontab命令详解编辑crontab特殊字符时间描述示例 实验1实验2实验3(重点)书写定时任务得注意事项 系统级别的计划任务(crontab的另一种计划任务)实验4

例行性工作(计划任务)

场景:

生活中,我们有太多场景需要使用到闹钟,比如早上7点起床,下午4点开会,晚上8点购物,等等。再Linux系统里,我们同样也有类似的需求。比如我们想在凌晨1点将文件上传到服务器,或者在晚上10点确认系统状态,等等。但是我们不可能一直守在电脑前,毕竟我们也需要下班/睡觉,还要陪女朋友。而且即使在上班期间,如果到点了还需要人工操作,未免效率太低了。at命令就是为这个需求而诞生的。使用at命令,你可以在特定时间自动完成你所设定的任务,也可以实现自动化,非常方便快捷。

单一执行的例行性任务—at(一次性)

安装

使用yum安装at

[root@server ~]# yum install at 1 at命令一般默认安装在系统中,通过下列命令查看版本号

[root@server ~]# at -V at version 3.1.23 12 查看at执行的状态

[root@server ~]# systemctl status atd # 查看状态 [root@server ~]# systemctl enable --now atd # 设置开机自启动 12 at命令详解

格式

at 日期时间 1

实例1

[root@server ~]# at 1:09 warning: commands will be executed using /bin/sh at> ls /root > at.txt at> <EOT> # 按下ctrl+d退出at输入状态 job 2 at Tue Nov 14 01:09:00 2023 # job 1为工作编号 [root@server ~]# at -l # 浏览计划任务列表 [root@server ~]# atq # 浏览计划任务列表 [root@server ~]# ls # 查看结果 公共 模板 视频 图片 文档 下载 音乐 桌面 anaconda-ks.cfg at.txt [root@server ~]# cat at.txt 1234567891011

参数

[root@server ~]# at -l atq:等价于at -l [root@server ~]# at -c 8 # 列出任务后的命令内容(8为工作编号) [root@server ~]# at -d 6 # 删除或取消一个任务(6为工作编号) 1234

实例2

不使用交互命令实现at任务

#从当前开始,经过1分钟后执行 [root@server ~]# echo "ls /root > at.txt" | at now +1 minutes warning: commands will be executed using /bin/sh job 11 at Tue Nov 14 01:45:00 2023 [root@server ~]# at -l 11 Tue Nov 14 01:45:00 2023 a root 工作编号 执行时的时间 [root@server ~]# echo "rm -fr /root/at.txt" | at now +1 minutes warning: commands will be executed using /bin/sh job 12 at Tue Nov 14 01:46:00 2023 123456789101112 时间格式 参数说明HH:MM在今天HH小时的MM分钟执行,若时间错过则在明天执行HH:MM YYYY-MM-DD规定在某年某月某日的特殊时间执行now +数字 时间单词now +2 minutes
now +3 hours
now +4 days
now +5 weeks
表示从当前开始,经过多长时间后执行

注意

at命令只要指定的时间正确,就可以执行对应的命令at命令的输出结果不会显示在屏幕上at命令中执行的命令最好使用绝对路径,不容易报错过程:输入at 时间—>回车—>输入执行命令—>ctrl+d退出at编辑按ctrl+Backspace删除at命令行中的错误输入at命令只会执行一次 at命令执行过程分析 第一步:寻找/etc/at.allow(白名单)是否存在,写在该文件中的用户才可执行at命令第二步:若/etc/at.allow不存在,则寻找/etc/at.deny(黑名单)文件,写在该文件中的用户不能使用at命令第三步:若两个文件都不存在,则只用root可以使用at命令注意:若拒绝某用户使用at命令则可以将用户名写入到/etc/at.deny中

实例3

设置某些账户不可使用at命令

[root@server ~]# useradd ce1 # 新建账户 [root@server ~]# passwd ce1 # 设置账户密码 更改用户 ce1 的密码 。 新的密码: 无效的密码: 密码少于 8 个字符 重新输入新的密码: passwd:所有的身份验证令牌已经成功更新。 [root@server ~]# id ce1 # 查看账户信息 用户id=1001(ce1) 组id=1001(ce1) 组=1001(ce1) [root@server ~]# vim /etc/at.deny # 编辑黑名单 写入ce1 [root@server ~]# su ce1 # 切换账户 [ce1@server root]$ cd [ce1@server ~]$ at 2:12 You do not have permission to use at. [ce1@server ~]$ su root 密码: [root@server ce1]# cd [root@server ~]# vim /etc/at.deny 删除ce1 [root@server ~]# su -l ce1 # 切换账户(-l回到用户的家目录) [ce1@server ~]$ at 2:14 warning: commands will be executed using /bin/sh at> <EOT> job 13 at Tue Nov 14 02:14:00 2023 [ce1@server ~]$ su -l root 密码: [root@server ~]#

12345678910111213141516171819202122232425262728

at

at 命令在 Linux 系统中被用来安排在将来某个时间执行一次性任务。这个命令非常有用,尤其是当你想要在系统负载较低时运行某项任务,或者当你想要在某个特定的时间自动执行某些操作时。

基本语法

at [选项] [时间] 1 时间:指定任务执行的时间。你可以使用绝对时间(如10:30 PM)或相对时间(如now + 1 hour)。 常用选项 -m:任务执行完成后,即使标准输出和标准错误都没有任何内容,也通过邮件发送任务执行的结果给用户。-f:指定一个包含命令的文件,而不是从标准输入中读取命令。-l(小写L):列出当前用户的所有待执行任务。-d:删除指定的任务。-q:指定队列的名称。默认情况下,at任务被提交到a队列。 使用示例

计划一个任务在特定时间执行

假设你想要在明天上午10点运行backup.sh脚本,你可以这样做:

echo "bash /path/to/backup.sh" | at 10AM tomorrow 1

或者,使用-f选项指定包含命令的文件:

at -f /path/to/commands.txt 10AM tomorrow 1

其中commands.txt包含你想要执行的命令。

查看所有待执行的任务

atq 1

或者

at -l 1

删除待执行的任务

首先,使用atq或at -l获取任务的编号,然后使用-d选项加上任务编号来删除它:

at -d <任务编号> 1 注意事项 atd服务(at daemon)需要运行,否则at命令将无法使用。你可以使用systemctl status atd(在基于systemd的系统中)来检查atd服务的状态。默认情况下,at命令的输出会通过邮件发送给任务提交者(如果系统配置了邮件服务)。如果系统没有配置邮件服务,你可能需要重定向输出到文件或其他位置。使用at命令时,需要确保你具有足够的权限。在某些系统上,普通用户可能需要通过sudo来提交任务。

at命令是 Linux 系统中管理定时任务的一个强大工具,它使得计划一次性任务变得简单而直接。

循环执行的例行性任务—crontab(周期性)

crond服务 at命令是在指定的时间只执行一次任务,crontab命令可以循环重复的执行定时任务,与Windows中的计划任务有些类似crond是Linux下用来周期地执行某种任务或等待处理某些事件的一个守护进程,在安装完成操作系统后,默认会安装crond服务工具,且crond服务默认就是自启动的,若需要安装则执行若下命令:

[root@server ~]# yum install crontabs 安装包名和服务包名不一样 [root@server ~]# systemctl status crond 123 crond进程每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务,crontab命令需要crond服务支持Linux任务调度的工作主要分为以下两类: 系统执行的工作:系统周期性所要执行的工作,如备份系统数据,清理缓存等等个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有信息,这些工作可由每个用户自行设置 crontab工作过程 当系统中有 /etc/cron.allow文件时,只有写入此文件的用户可以使用crontab命令,没有写入的用户不能使用crontab命令。同样,如果有此文件,/etc/cron.deny文件会被忽略,因为/etc/cron.allow文件的优先级更高当系统中只有/etc/cron.deny文件时,写入此文件的用户不能使用crontab命令,没有写入文件的用户可以使用crontab命令crontab执行的每一项工作都会被记录到/var/log/cron这个日志文件中当用户使用crontab新建工作之后,该项工作就会被记录到/var/spool/cron目录里面 crontab命令详解

格式

crontab [-u user] [-l | -r | -e] 1

参数

参数说明-u指定用户执行该任务-e编辑crontab工作内容-l查询crontab任务内容-r删除crontab任务 编辑crontab

格式

crontab -e 1

注意:

写入的命令一行一个命令,每行共6段:前5段为时间,最后一段为命令时间共5段,意义如下: 表示意义分时天月星期数字范围0-590-231-311-120-7(0和7都表示星期天) 特殊字符

* 表示任意时刻 - 表示范围 , 分割时段 */数字 指定时间间隔频率,如:每3分钟执行一次:*/3 1234 时间描述示例

1 2 * * * 每天凌晨2点1分执行动作 0 17 * * 1 每周1下午5点整执行动作 0 5 1,15 * * 每月的1日和15日凌晨5点整执行动作 40 4 * * 1-5 每周1到周5凌晨4点40分执行动作 */10 4 * * * 每天凌晨4点每隔10分钟执行动作 3,15 8-11 */2 * * 每隔2天上午8-11点的第3分钟和第15分钟执行动作 * * * * * 每隔1分钟执行动作 1234567 实验1 编写脚本test.sh(脚本必须以.sh为文件扩展名)

[root@server ~]# vim test.sh 1

#!/bin/bash (指定脚本解释器) while : do echo "this is my test sh"$(date) >> /root/cro.txt sleep 1 done 1234567 设置周期性的计划任务

[root@server ~]# crontab -u redhat -e 12

默认当前用户

[root@server ~]# crontab -e 1

*/1 * * * * /bin/bash /root/test.sh 1

注意:crond服务会自动启动,crontab命令只要保存就会生效

查看任务 -l

[root@server ~]# crontab -l */1 * * * * /bin/bash /root/test.sh 12 删除任务 -r

[root@server ~]# crontab -r # 删除 [root@server ~]# crontab -l # 查看 no crontab for root 123 此实验需要终止循环进程

[root@server ~]# ps -aux | grep test # 查看已存在的test进程 root 3895 0.0 0.1 221680 2372 pts/0 S+ 10:59 0:00 grep --color=auto test [root@server ~]# kill -9 进程号 [root@server ~]# kill -9 3895 # 强制终止 1234 实验2 让系统每周1凌晨6点重启一次

[root@server ~]# crontab -e 1

0 6 * * 1 /sbin/shutdown -r now 1

[root@server ~]# crontab -l 0 6 * * 1 /sbin/shutdown -r now 12 不想执行该任务可以删除

[root@server ~]# crontab -r [root@server ~]# crontab -l no crontab for root 123 实验3(重点)

实验内容:设置邮件发送功能:每1分钟发送1封邮件

首先我们要做的就是QQ邮箱设置

1.使用浏览器打开qq邮箱,点击设置
在这里插入图片描述
2.点击账号
在这里插入图片描述
3.选择POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,然后开启服务,获得授权码
在这里插入图片描述
在这里插入图片描述

安装邮件服务

注:不同发行版本的邮件服务名不一样,RHEL9的邮件服务名为s-nail

[root@server ~]# yum install s-nail -y 1 配置邮件服务

[root@server ~]# vim /etc/s-nail.rc 1

set from=123456789@qq.com set smtp=smtp.qq.com set smtp-auth-user=123456789@qq.com set smtp-auth-password=abcdefghijklmnop # 这里是16位的授权码 set smtp-auth=login 12345

注意:文件配置完毕需要强制保存并退出,末行模式下输入wq!

测试一下邮件服务

[root@server ~]# echo '内容' | mail -s '主题' 123456789@qq.com 1

敲完这个命令后,在你的qq邮箱就会立刻收到邮件
在这里插入图片描述

测试完成,我们再来设置周期性的任务,每个1分钟发送邮件

[root@server ~]# crontab -e 1

MAILTO=17674044@qq.com * * * * * echo "警告,server服务器内存较低,请速处理." | mail -s "告警邮件" 123456789@qq.com 123

在这里插入图片描述

实验完成之后,删除循环执行任务,不然你的qq邮箱得爆,哈哈哈

[root@server ~]# crontab -r [root@server ~]# crontab -l no crontab for root 123 书写定时任务得注意事项 6个字段都不能为空,如果不确定则使用*表示任意时间crontab命令任务的最小时间单位为分钟,最大有效时间为月,如:2024年某时执行、3点30分30秒这样的时间日期无法被识别定义时间时,日期和星期最好不要一起出现,由于都是以天为单位,非常让管理员混淆在定时任务中不能,不管是写命令还是在脚本中写命令,最好都用绝对路径,相对路径有时会报错 系统级别的计划任务(crontab的另一种计划任务)

crontab -e是每个用户都可以执行的命令,但是有时定时任务必须由系统执行,此时就需要编辑 /etc/crontab配置文件来实现

[root@server ~]# vim /etc/crontab 1 仅能通过root定义,不可以使用普通账户身份去执行计划任务方法:在/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 123456789101112131415 分析: SHELL=/bin/bash :指定系统使用哪个shell解释器去执行PATH=/sbin:/bin:/usr/sbin:/usr/bin : 系统执行命令的搜索路径MAILTO=root :表示执行任务的信息通过邮件发送给谁MAILTO=root :表示执行命令的用户是谁 实验4

每天6:00将日志文件/var/log/messages文件进行备份,备份到/backup目录中,备份时需要将logfileYYYY-MM-DD-HH:MM:SS

[root@server ~]# mkdir /backup [root@server ~]# vim /etc/crontab 0 6 * * * root /usr/bin/cp /var/log/messages /backup/logfile`date +\%Y-\%m-\%d-\%H:\%M:\%S` # 注意# 反引号``:表示将引起的内容识别为命令# 在crontab中%表示换行,需要增加转义符\进行转义 123456789

网址:Linux下的at命令与crontab:自动化例行与周期性任务管理 https://www.yuejiaxmz.com/news/view/764326

相关内容

Linux多用户环境的定时任务管理:cron与at高级应用指南
Linux下的自动化任务与计划任务:让你的系统更智能
如何进行常见的linux自动化任务
Linux系统中的crontab:任务自动化执行详解
轻松学习Linux之自动执行任务
Linux at命令自动化任务调度指南
这些 Linux 的“自动化”技巧,教你轻松完成任务
如何在Linux上自动化任务
Linux使用crontab定时执行脚本任务的流程详解
linux中的延时定时任务管理

随便看看