Linux 计划任务

有时需要在某个指定的时间执行一个操作,此时就要使用计划任务了。计划任务有两种:一个是at计划任务,另一个是crontab计划任务。

1.1 at

at计划任务是一次性的,到了指定的时间点就开始执行指定的命令,执行完成之后,不会重复执行这个命令。

首先查看系统中是否存在at计划任务,命令是atq或at -l(字母l),命令如下。

[root@RedHat ~]# atq
[root@RedHat ~]# at -l
[root@RedHat ~]#

这两个命令都没有任何输出,说明当前系统中并不存在任何计划任务。下面开始创建at计划任务,at的用法如下。

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

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

[root@RedHat ~]# at 2025-12-12
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 1 at Fri Dec 12 10:49:00 2025
[root@RedHat ~]#

这里只是指定了日期,并没有指定在2025年12月12日的几点执行。那么,创建这个计划任务时是几点几分,例如,这里是在19点11分创建的at计划任务,那么到了2025年12月12日的19点11分就要自动执行hostname命令了。

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

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

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

[root@RedHat ~]# at 10:00 2025-12-12
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 2 at Fri Dec 12 10:00:00 2025
[root@RedHat ~]#

这里上午用am表示,下午用pm表示。例如,要在2025年12月12日下午10点执行hostname命令,命令如下。

[root@RedHat ~]# at 10pm 2025-12-12
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 4 at Fri Dec 12 22:00:00 2025
[root@RedHat ~]#

at也支持某天之后的某个时间点运行一个命令。例如,要在三天之后的下午4点执行hostname命令,命令如下。

[root@RedHat ~]# at 4pm + 3days
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 5 at Mon Dec 11 16:00:00 2023
[root@RedHat ~]#

这里“+”两边有没有空格都可以,days可以换成weeks,表示3周之后的下午4点。

如果想在第二天的下午4点执行hostname命令,命令如下。

[root@RedHat ~]# at 4pm + 1days
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 6 at Sat Dec  9 16:00:00 2023
[root@RedHat ~]#

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

[root@RedHat ~]# at 4pm tomorrow
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 7 at Sat Dec  9 16:00:00 2023
[root@RedHat ~]#

上面的两条命令都是表示第二的下午4点执行hostname命令。

这样的关键词还包括today表示今天,例如,要在今天下午10点执行hostname命令,命令如下。

[root@RedHat ~]# at 10pm today
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 8 at Fri Dec  8 22:00:00 2023
[root@RedHat ~]#

如果是今天只执行一个命令,关键词today是可以不写的,不写默认就是今天。 

[root@RedHat ~]# at 10pm
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 9 at Fri Dec  8 22:00:00 2023
[root@RedHat ~]#

如果要表示几分钟或几小时之后,可以使用关键词now。例如,要在2小时之后执行hostname命令,命令如下。

[root@RedHat ~]# at now+2hours
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 10 at Fri Dec  8 13:21:00 2023
[root@RedHat ~]#

如果想在一分钟之后删除/tmp下面所有的内容,命令如下。

[root@RedHat ~]# at now+1minutes
warning: commands will be executed using /bin/sh
at> rm -rf /tmp*
at> <EOT>
job 12 at Fri Dec  8 11:23:00 2023
[root@RedHat ~]#

1分钟之后就是11:23分,开始执行rm -rf /tmp*命令。下面来验证一下,先查看/tmp下的内容。

[root@RedHat ~]# date ; ls /tmp
2023年 12月 08日 星期五 11:26:16 CST
[root@RedHat ~]#

可以看到,/tmp中的内容已经被清空了。

到现在为止已经做了多个at计划任务了,现在来查看一下有多少个了。通过atq或at -l都可以查看。

[root@RedHat ~]# atq
1	Fri Dec 12 10:49:00 2025 a root
2	Fri Dec 12 10:00:00 2025 a root
4	Fri Dec 12 22:00:00 2025 a root
5	Mon Dec 11 16:00:00 2023 a root
6	Sat Dec  9 16:00:00 2023 a root
7	Sat Dec  9 16:00:00 2023 a root
8	Fri Dec  8 22:00:00 2023 a root
9	Fri Dec  8 22:00:00 2023 a root
10	Fri Dec  8 13:21:00 2023 a root
11	Fri Dec  8 11:23:00 2023 a root
[root@RedHat ~]#

可以看到,每个at计划任务前都有一个编号。如果要删除某个at计划任务,可以用如下命令。

atrm N 或 at -d N

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

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

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

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

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

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

[root@RedHat ~]# atq
1	Fri Dec 12 10:49:00 2025 a root
2	Fri Dec 12 10:00:00 2025 a root
4	Fri Dec 12 22:00:00 2025 a root
10	Fri Dec  8 13:21:00 2023 a root
11	Fri Dec  8 11:23:00 2023 a root
[root@RedHat ~]#

可以看到,编号5到9都已经删除了。

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

at -c N

这里N指的是atq查看结果中前面的编号。例如,要查看第一个at计划任务的内容,可以通过如下命令。

[root@RedHat ~]# at -c 1 | tail -3
${SHELL:-/bin/sh} << 'marcinDELIMITER158c61d7'
hostname
marcinDELIMITER158c61d7
[root@RedHat ~]# 

这里at -c 1的结果太多,所以通过管道传递给tail命令,获取最后3行的内容。可以看到,第一个at计划任务中执行的是hostname命令。

任何用户都是可以创建at计划任务的,下面使用bdqn用户创建一个at计划任务。在第二个终端中使用bdqn登录,然后用atq查看是否有at计划任务。

[bdqn@RedHat ~]$ atq
[bdqn@RedHat ~]$

可以看到,bdqn用户并没有at计划任务。下面使用bdqn用户随便创建一个at计划任务,例如,要在3小时之后执行hostname命令。 

[bdqn@RedHat ~]$ at now+3hours
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 13 at Fri Dec  8 14:53:00 2023
[bdqn@RedHat ~]$

这里是可以正常创建的,如果要禁止哪个用户创建at计划任务,只要把这个用户名写入/etc/at.deny中即可,一行一个用户。下面练习禁止bdqn用户创建at计划任务,使用root做如下操作。 

[root@RedHat ~]# echo bdqn > /etc/at.deny 
[root@RedHat ~]# cat /etc/at.deny 
bdqn
[root@RedHat ~]#

凡是出现在/etc/at.deny文件中的用户都是不允许创建at计划任务的。切换到bdqn用户创建at计划任务。 

[bdqn@RedHat ~]$ at now+2hours
You do not have permission to use at.
[bdqn@RedHat ~]$

可以看到bdqn用户已经没有权限创建了。

如果想继续允许bdqn用户创建at计划任务,有以下两种方法。

(1)把bdqn用户从/etc/at.deny中删除。

(2)把bdqn用户添加到/etc/at.allow中。

/etc/at.allow这个文件默认不存在,需要创建出来,且at.allow的优先级要高于at.deny,所以bdqn如果同时出现在这两个文件中,那么at.allow生效。

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

[root@RedHat ~]# echo bdqn > /etc/at.allow
[root@RedHat ~]# cat /etc/at.allow 
bdqn
[root@RedHat ~]# cat /etc/at.deny 
bdqn
[root@RedHat ~]#

现在bdqn用户在at.allow和at.deny中都存在,at.allow生效,所以bdqn用户是可以创建at计划任务的。切换到bdqn用户创建at计划任务。 

[bdqn@RedHat ~]$ at now+2hours
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 15 at Fri Dec  8 14:02:00 2023
[bdqn@RedHat ~]$

可以看到bdqn用户已经可以创建at计划任务了。

1.2 crontab

at计划任务是一次性的,执行完成就结束,不会重复执行。如果想定期执行某个任务,例如,每周日凌晨2点执行一个命令,这时就要用到crontab了。

查看当前用户是否有crontab计划任务,可以用crontab -l命令。如果要查看其他用户是否有crontab计划任务,可以用“crontab -l -u 用户名”命令,不过-u选项只有root才能用。

(1)使用root用户查看自己有没有crontab计划任务,命令如下。

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

(2)使用root用户查看bdqn用户有没有crontab计划任务,命令如下。

[root@RedHat ~]# crontab -l -u bdqn
no crontab for bdqn
[root@RedHat ~]#

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

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

分 时 天 月 周 命令

几个时间单位的意义如下。
(1)分:几点几分的分。
(2)时:几点,24小时制。
(3)天:几号。
(4)月:几月份。
(5)周:星期几。 

如果不考虑某个时间单位,例如,不管今天是几号,只要不是周末我们就上班,不考虑“天”的情况下,那么可以用*表示。

这里每个时间点都可以写多个值,用英文逗号“,”隔开,例如,在分的位置写“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命令,命令如下。

# 分 时 天 月 周
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命令的,因为“月”没有满足条件。

(4)第一季度中每月上旬的上午7点整执行hostname命令,命令如下。

# 分 时 天 月 周
0 7 1‐10 1‐3 * hostname

一年的第一季度是1到3月份,每月上旬是1到10日,这里分、时、天、月(没有周)是“和”的关系,这4个时间单位必须都满足才能执行hostname命令。 

所以,5月8日上午7点整是不会执行hostname命令的,因为“月”没有满足条件。大家要记住“天”和“周”是“或”的关系,即

(1)分、时、月、周同时满足了,即使“天”不满足条件,也会执行指定的命令。
(2)分、时、天、月同时满足了,即使“周”不满足条件,也会执行指定的命令。

(5)在5个时间点都写的情况,命令如下。

# 分 时 天 月 周
0 7 1‐10 1‐3 1‐5 hostname

这里天和周的位置都写了,本句的意思并不是说每年1到3月份的上旬,且要满足周一到周五的上午7点整才执行hostname命令。

这句的意思是每年的1到3月份这3个月,每月1到10日或周一到周五(二者满足其一),上午7点整都会执行hostname命令。这条其实综合了上面(3)和(4)中的意思。
现在最终的crontab计划任务内容如下。 

[root@RedHat ~]# crontab -l
0 7 * * * hostname
0 7 * * 1,2,3,4,5 hostname
0 7 * * 1‐5 hostname
0 7 * 1‐3 1‐5 hostname
0 7 1‐10 1‐3 * hostname 
0 7 1‐10 1‐3 * hostname 
[root@RedHat ~]# 

如果要编辑crontab计划任务,通过crontab -e来重新编辑,如果要删除,执行 crontab -r命令即可,命令如下。 

[root@RedHat ~]# crontab -r
[root@RedHat ~]# crontab -l
no crontab for root
[root@RedHat ~]#

普通用户也是可以创建crontab计划任务的,如果不想让这个用户创建crontab计划任务,则把这个用户写入/etc/cron.deny中即可,一行一个用户。这个文件默认为空,命令如下。 

[root@RedHat ~]# echo bdqn > /etc/cron.deny 
[root@RedHat ~]# cat /etc/cron.deny 
bdqn
[root@RedHat ~]#

在第二个终端中用bdqn用户登录,然后测试创建一个crontab计划任务,命令如下。

[bdqn@RedHat ~]$ crontab -e
You (bdqn) are not allowed to use this program (crontab)
See crontab(1) for more information
[bdqn@RedHat ~]$

可以看到,bdqn用户现在无法创建crontab计划任务了。

如果又想让bdqn用户可以创建crontab计划任务,有以下两种方法:
(1)把bdqn用户从/etc/cron.deny 中删除,这种方法大家自行练习。
(2)创建/etc/cron.allow,这个文件默认不存在,把tom用户名写到此文件中,命令如下。

[root@RedHat ~]# ls /etc/cron.allow
ls: 无法访问'/etc/cron.allow': 没有那个文件或目录
[root@RedHat ~]# echo bdqn > /etc/cron.allow
[root@RedHat ~]#

现在bdqn用户既出现在/etc/cron.allow中,又出现在/etc/cron.deny中,命令如下。 

[root@RedHat ~]# cat /etc/cron.deny 
bdqn
[root@RedHat ~]# cat /etc/cron.allow 
bdqn
[root@RedHat ~]#

此时cron.allow文件生效。

在第二个标签中用bdqn用户登录,crontab计划任务是能够创建的。

系统中也自带一些crontab计划任务,在/etc 中存在几个以cron开头的目录,命令如下。

[root@RedHat ~]# ls /etc/cron*
/etc/cron.allow  /etc/cron.deny  /etc/crontab

/etc/cron.d:
0hourly  raid-check

/etc/cron.daily:
logrotate

/etc/cron.hourly:
0anacron

/etc/cron.monthly:

/etc/cron.weekly:
[root@RedHat ~]#

每天都会执行一次/etc/crondaily中的脚本,每小时都会执行一次/etc/cron.hourly中的脚本,每月都会执行一次/etc/cron.monthly中的脚本,每周都会执行一次/etc/cron.weekly中的脚本。 

  • 27
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值