RHEL计划任务

目录

前言

1.at

2.Crontab 


前言

有时需要在某个指定的时间执行一个操作,此时就要使用计划任务了。计划任务有两种: 一个是at计划任务,另一个是 crontab计划任务
下面我们分别来看这两种计划任务的使用方法。

1.at

at计划任务是一次性的,到了指定的时间点就开始执行指定的命令,执行完成之后,不会重复执行这个命令。
首先查看系统中是否存在at计划任务,命令是atq或at -l(字母l),命令如下。
[root@RHEL813 ~]# atq
[root@RHEL813 ~]#  
[root@RHEL813 ~]# at ‐l
[root@RHEL813 ~]#
这两个命令都没有任何输出,说明当前系统中并不存在任何计划任务。下面开始创建at计划任务,at的用法如下。
at 时间点 <按【Enter】键>
> 输入要执行的命令
Ctrl+D 提交

 例如,要在2025年12月12日执行hostname命令,命令如下。

[root@RHEL813 ~]# at 2025-12-12
warning: commands will be executed using /bin/sh
at> hostname
at> 
job 1 at Fri Dec 12 21:12:00 2025
[root@RHEL813 ~]# 
这里只是指定了日期,并没有指定在2025年12月12日的几点执行。那么,创建这个计划任务时是几点几分,例如,这里是在10点13分创建的at计划任务,那么到了2025年12月12日的10点13分就要自动执行hostname命令了。

如果要指定某个时间点,格式如下。 

at 时间 日期 <按【Enter】键>
> 输入要执行的命令
Ctrl+D 提交

 例如,要在2025年12月12日上午10点执行 hostname命令,命令如下。

[root@RHEL813 ~]# at 10:00 2025-12-12
warning: commands will be executed using /bin/sh
at> hostname
at> 
job 2 at Fri Dec 12 10:00:00 2025
[root@RHEL813 ~]# 
注意
(1)这里是24小时制的,所以10:00指的是上午10点,如果想指定下午10点,则要写成22:00。
(2)写时间最多只能精确到分,不能精确到秒。
这里上午用am表示,下午用pm表示。例如,要在2025年12月12日下午10点执行
hostname命令,命令如下。
[root@RHEL813 ~]# at 10pm 2025-12-12
warning: commands will be executed using /bin/sh
at> hostname
at> 
job 3 at Fri Dec 12 22:00:00 2025
[root@RHEL813 ~]# 
at也支持某天之后的某个时间点运行一个命令。例如,要在3天之后的下午4点执行,hostname命令,命令如下。
[root@RHEL813 ~]# at 4pm +3days
warning: commands will be executed using /bin/sh
at> hostname
at> 
job 4 at Wed Dec 13 16:00:00 2023
[root@RHEL813 ~]# 
这里“+”两边有没有空格都可以,days可以换成weeks,表示3周之后的下午4点。
如果想在第二天的下午4点执行hostname命令,命令如下。
[root@RHEL813 ~]# at 4pm + 1days
warning: commands will be executed using /bin/sh
at> hostname    
at> 
job 5 at Mon Dec 11 16:00:00 2023
[root@RHEL813 ~]# 

 或者用关键字tomorrow,如果使用关键字tomorrow,则不需要加“+”,命令如下

[root@RHEL813 ~]# at 4pm tomorrow
warning: commands will be executed using /bin/sh
at> hostname
at> 
job 7 at Mon Dec 11 16:00:00 2023
[root@RHEL813 ~]# 
上面的两条命令都是表示第二天的下午4点执行hostname命令。
这样的关键字还包括today,表示“今天”。例如,要在今天下午10点执行hostname命令,命令如下 
[root@RHEL813 ~]# at 10pm today
warning: commands will be executed using /bin/sh
at> hostname
at> 
job 8 at Sun Dec 10 22:00:00 2023
[root@RHEL813 ~]# 

 如果是今天执行一个命令,关键字today是可以不写的,不写日期默认就是“今天”。

[root@RHEL813 ~]# at 10pm
warning: commands will be executed using /bin/sh
at> hostname
at> 
job 10 at Sun Dec 10 22:00:00 2023
[root@RHEL813 ~]# 
如果要表示几分钟或几小时之后,可以用关键字now。例如,要在2小时之后执行
hostname命令,命令如下
[root@RHEL813 ~]# at now+2hours
warning: commands will be executed using /bin/sh
at> hostname
at> 
job 11 at Sun Dec 10 23:43:00 2023
[root@RHEL813 ~]# 
到现在为止已经做了很多个at计划任务了,现在来查看一下有多少个了。通过atq或at -1都可以查看。
[root@RHEL813 ~]# atq
1	Fri Dec 12 21:12:00 2025 a root
2	Fri Dec 12 10:00:00 2025 a root
3	Fri Dec 12 22:00:00 2025 a root
4	Wed Dec 13 16:00:00 2023 a root
5	Mon Dec 11 16:00:00 2023 a root
6	Mon Dec 11 16:00:00 2023 a root
7	Mon Dec 11 16:00:00 2023 a root
8	Sun Dec 10 22:00:00 2023 a root
9	Sun Dec 10 22:00:00 2023 a root
10	Sun Dec 10 22:00:00 2023 a root
11	Sun Dec 10 23:43:00 2023 a root
[root@RHEL813 ~]# 
可以看到,每个at计划任务前都有一个编号。如果要删除某个at计划任务,可以用如下命令
atrm N 或 at ‐d N

 这里N指的是atq查看结果中前面的编号

假设现在要删除编号为9的at计划任务,命令如下。 

[root@RHEL813 ~]# atrm 9
[root@RHEL813 ~]# 

 如果删除编号为5到8的这些at计划任务,命令如下

[root@RHEL813 ~]# atrm {5..8}
[root@RHEL813 ~]#

 查看现在还有的at计划任务,命令如下。

[root@RHEL813 ~]# atq
1	Fri Dec 12 21:12:00 2025 a root
2	Fri Dec 12 10:00:00 2025 a root
3	Fri Dec 12 22:00:00 2025 a root
4	Wed Dec 13 16:00:00 2023 a root
10	Sun Dec 10 22:00:00 2023 a root
11	Sun Dec 10 23:43:00 2023 a root
[root@RHEL813 ~]# 
可以看到,5到9都已经删除了,现在只剩下1到4,10和11了。

查看at计划任务的具体内容,命令如下。 

at ‐c N
这里N指的是 atq查看结果中前面的编号。例如,要查看第一个at计划任务的内容,可以通过如下命令。
[root@RHEL813 ~]# at -c 1 | tail -3
${SHELL:-/bin/sh} << 'marcinDELIMITER06e89ecb'
hostname
marcinDELIMITER06e89ecb
[root@RHEL813 ~]# 
这里at -c 1的结果太多,所以通过管道传递给tail 命令,获取最后3行的内容。可以看到,第一个at计划任务中执行的命令是hostname。
任何用户都是可以创建at计划任务的,下面使用bdqn用户创建一个at计划任务。在第二个终端中使用bdqn登录,然后用atq查看是否有at计划任务。
[bdqn@RHEL813 ~]$ atq
[bdqn@RHEL813 ~]$ 
可以看到,bdqn用户并没有at计划任务。下面使用bdqn用户随便创建一个at计划任务,例如,要在3小时之后执行hostname命令。
[bdqn@RHEL813 ~]$ at now+3hours
warning: commands will be executed using /bin/sh
at> hostname
at> 
job 12 at Mon Dec 11 00:54:00 2023
[bdqn@RHEL813 ~]$ 
这里是可以正常创建的,如果要禁止哪个用户创建at计划任务,只要把这个用户名写入/etc/at.deny中即可,一行一个用户。下面练习禁止 bdqn用户创建at计划任务,使用root做如下操作
[root@RHEL813 ~]# echo bdqn > /etc/at.deny 
[root@RHEL813 ~]# cat /etc/at.deny 
bdqn
[root@RHEL813 ~]# 
凡是出现在/etc/at.deny文件中的用户都是不允许创建at计划任务的。切换到tom用户创建at计划任务。
[bdqn@RHEL813 ~]$ at now+3hours
You do not have permission to use at.
[bdqn@RHEL813 ~]$ 
可以看到,tom用户已经没有权限创建了。
如果想继续允许tom用户创建at计划任务,有以下两种方法。
(1)把tom用户从/etc/at.deny中删除。
(2)把 tom用户添加到/etc/at.allow中。
/etc/at.allow这个文件默认不存在,需要创建出来,且 at.allow 的优先级要高于
at.deny,所以 tom 如果同时出现在这两个文件中,那么at.allow生效。

 下面设置tom用户可以创建at计划任务,使用root做如下操作。

[root@RHEL813 ~]# echo bdqn > /etc/at.allow 
[root@RHEL813 ~]# cat /etc/at.allow 
bdqn
[root@RHEL813 ~]# cat /etc/at.deny 
bdqn
[root@RHEL813 ~]# 
现在tom用户在at.allow 和 at.deny中都存在,at.allow生效,所以 tom用户是可以创建at计划任务的。切换到tom用户创建at计划任务。
[bdqn@RHEL813 ~]$ at now+3hours
warning: commands will be executed using /bin/sh
at> ^C[bdqn@RHEL813 ~]$ 
[bdqn@RHEL813 ~]$ 

 这里可以看到at提示符,说明bdqn用户可以创建at计划任务了,按【Ctrl+C】组合键终止。

2.Crontab 

at计划任务是一次性的,执行完成就结束,不会重复执行。如果想定期执行某个任务,例如,每周日凌晨2点执行一个命令,这时就要用到crontab了。
查看当前用户是否有 crontab计划任务,可以用crontab -l命令。如果要查看其他用户是否有crontab计划任务,可以用“crontab -l -u用户名”命令,不过-u选项只有root才能用。

步骤①:使用root用户查看自己有没有crontab计划任务,命令如下。 

[root@RHEL813 ~]# crontab -l
no crontab for root
[root@RHEL813 ~]# 

 步骤②:使用root用户查看bdqn用户是否有crontab计划任务,命令如下。

[root@RHEL813 ~]# crontab -l -u bdqn
no crontab for bdqn
[root@RHEL813 ~]# 
创建crontab计划任务的命令是crontab -e,如果为其他用户创建crontab计划任务,则用“crontab -e -u用户名”命令。
当使用crontab-e命令时,会打开一个临时文件,用与 vim 一样的语法来编辑此文件即可。先按【i】键进入插入模式,编辑完成之后,按【Esc】键退回到命令模式,在末行模式中输入“wq”保存退出。在此文件中凡是以“#”开头的,都是注释行

 crontab定义计划任务的语法如下。

分 时 天 月 周 命令 
注意
因为在crontab中使用的并非系统的PATH变量,所以此处语法中要执行的命令最好能加上路径,
例如,要执行ifconfig命令,则写作/sbin/ifconfig;要执行hostname命令,则写作
bin/hostname。命令的路径可以通过which命令来查询。

几个时间单位的意义如下。 

(1)分:几点几分的分。
(2)时:几点,24小时制。
(3)天:几号。
(4)月:几月份。
(5)周:星期几。

这几个时间单位可以用空格,也可以用【Tab】键来分隔。

如果不考虑某个时间单位,例如,不管今天是几号,只要不是周末我们就上班,不考虑“天”的情况下,那么可以用*表示。
这里每个时间点都可以写多个值,用英文逗号“,”隔开,例如,在分的位置写“0,1.,5,10", 表示0分、1分、5分、10分。
也可以用横杠“-”表示“到”的意思,例如,在分的位置写“0-10”,表示0到10分。
这里“0-10”的完整写法是“0-10/1”,表示从0分到10分的每一分钟,从0开始每次增
加1,然后到10。如果表示“每N分钟”,则写成“0-10/N”,例如,0到10中每2分钟,则 写成“0-10/2”,表示0分、2分、4分、6分、8分、10分。
练习1:每天上午7点整执行hostname命令,如果写成如下命令。
# 分 时 天 月 周
* 7 * * * hostname
这种写法是不对的,第一个位置是分,这里写成了*,表示7点的每一分,包括0分、1分……但是所谓7点整的意思是7点0分,所以要写成如下命令。
# 分 时 天 月 周
0 7 * * * hostname

练习2:每周一到周五的上午7点整执行hostname命令,命令如下 

# 分 时 天 月 周
0 7 * * 1,2,3,4,5 hostname
这里可以写成如下命令
# 分 时 天 月 周
0 7 * * 1‐5 hostname

 这里1-5表示周一到周五,如果是周六的上午7点整,就不会执行hostname命令。

练习3:第一季度中每周一到周五的上午7点整执行hostname命令,命令如下。 

# 分 时 天 月 周
0 7 * 1‐3 1‐5 hostname
一年的第一季度是1到3月份,这里分、时、月、周(没有天)是“和”的关系,这4个时间单位必须都满足才能执行hostname命令。
所以,5月份的周三上午7点整是不会执行hostname命令的,因为“月”没有满足条件。

你可能感兴趣的:(linux,运维,服务器)