目录
一 、 at命令 :仅执行一次就结束调度
at命令是避免忘记在将来特定时间的任务或在你离开时让计算机为你运行任务的非常好的方式。
1.at命令详解
at [ 参数 ] [ 时间 ]
atq 查看用户的at调度
atrm 取消一个at调度中的工作
1.1参数详情
-l 列出目前系统上该用户的所有at调度,与atq作用相同
-d 取消一个在at调度中的工作, 与atrm作用相同
-m 当 at 工作完成后,无论命令是否输出,都用 E-mail 通知执行 at 命令的用户
-f 指定所要提交的脚本文件
-c 工作标识号 显示该at工作的实际内容
1.2时间格式
时间和日期可以是绝对的,也可以添加一个加号 ( + ) 使它们相对于现在。在指定相对时间时,下面这些日常生活中所使用的词汇都可以使用:minutes hours days weeks months years
HH:MM 今天的HH时MM分
HH:MM XXXX-YY-ZZ 某年某月某日的 HH时MM分
now + 1 minutes 从现在开始一分钟
下面举几个例子:(有警告,我们不用管他,可能是因为root用户执行命令的缘故)
[root@localhost li]# at 14:40 2023-04-09
warning: commands will be executed using /bin/sh
at>
[root@localhost li]# at 14:45
warning: commands will be executed using /bin/sh
at>
[root@localhost li]# at now + 1 minutes
warning: commands will be executed using /bin/sh
at>
2. at命令的访问控制
2.1 白名单 /etc/at.allow (优先级略高)
如果系统中有 /etc/at.allow 文件,那么只有写入 /etc/at.allow 文件(白名单)中的用户可以使用 at 命令,其他用户不能使用 at 命令
2.2 黑名单 /etc/at.deny
有 /etc/at.deny 文件,那么写入 /etc/at.deny 文件中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效。
如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令
二 、 crontab命令 :循环执行
crontab命令是Linux用于设置周期性被执行的指令,一般精确到分级,秒级一般用shell脚本。
1.crontab命令详解
[root@localhost li]# crontab -help
crontab: 不适用的选项 -- h
crontab: usage error: unrecognized option
Usage:
crontab [options] file
crontab [options]
crontab -n [hostname]
Options:
-u <user> define user
-e edit user's crontab
-l list user's crontab
-r delete user's crontab
-i prompt before deleting
-n <host> set host in cluster to run users' crontabs
-c get host in cluster to run users' crontabs
-T <file> test a crontab file syntax
-s selinux context
-V print version and exit
-x <mask> enable debugging
1.1 常用选项
crontab -e 编辑用户crontab
crontab -l 列出用户crontab
crontab -r 删除用户crontab
crontab -i 删除前提示
crontab -n 设置主机在集群中运行用户的crontab
crontab -c 让主机在集群中运行用户的crontab
1.2 crontab计划任务的时间格式
分 | 时 | 日 | 月 | 周 |
0-59 | 0-23 | 1-31 | 1-12 | 0-7 |
举个例子:
0 15 * * * 在每天的 15:00
0 15 * * 1 在每周一的15:30
0 15 1,15 * * 在每月的1日15日的 15:30
0 15 * * 1-5 在每周一至周五的 15:30
*/10 15 * * * 在每天的15:00 每隔 十分钟
0 0 1,15 * 1 在每月的1号,15号 周一的 零点零分
1.3 crontab计划任务的时间格式中的特殊符号
特殊字符 | 含义 |
---|---|
* | 任何时刻 |
, | 分割时段 1,3,5,7 |
- | 一段时间 (1-7) |
/数字 | 时间间隔频率 比如 */3 |
注:%在crontab里面有特殊含义,如果有命令里面需要使用%,需要使用\转义。
2. crontab的访问控制命令
该命令和 at 命令类似,也是通过 /etc/cron.allow 和 /etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。而且原则也非常相似:/etc/cron.allow 文件比 /etc/cron.deny 文件的优先级高,Linux 系统中默认只有 /etc/cron.deny 文件。
每个用户都可以使用crontab实现自己的定时命令,通过crontab [ -u user ] file
3.系统的计划任务
anacron 可以处理关机状态时未执行的计划任务,anacron不能指定何时执行某项任务,而是以天为单位或是在开机后立刻进入anacron的操作(/etc/anacrontab
)。它会去检测停机期间应该进行但是并没有进行的crontab任务,并将该任务执行一遍,然后anacron就会自动停止了
[root@localhost li]# 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
当需要同一时间执行多个脚本时,可以将这多个脚本放在一个目录下,然后使用run-parts来执行。
run-parts:该命令可将后面接的“目录”内的所有文件找出来执行。
三 、练习
1.指定在2023/08/26 09:00将时间写入testmail.txt文件中
[root@localhost /]# at 9:00 2023-08-26
warning: commands will be executed using /bin/sh
at> date > testmail
at> <EOT>
job 1 at Sat Aug 26 09:00:00 2023
[root@localhost /]# atq
1 Sat Aug 26 09:00:00 2023 a root
2.指定在每天凌晨4:00将该时间点之前的系统日志信息备份到个目录下(/var/log/messages ),备份后日志文件名显示格式logfileYY-MM-DD HH-MM
($(date +%Y-%m-%d-%H-%M)是一个shell命令,用于获取当前日期和时间,并将其格式化为YYYY-MM-DD HH-MM的形式)
0 4 * * * cp /var/log/messages /var/log/messages.$(date+\%Y-\%m-\%d-\%H-\%M\)
[root@localhost /]# crontab -l
0 4 * * * cp /var/log/messages /var/log/messages.$(date+\%Y-\%m-\%d-\%H-\%M\)