目录
一.计划任务概念解析
二.Liunx计划任务管理工具
1. at命令
基本语法
时间格式
常用选项
2. crontab命令
crontab 文件
/etc/cron.allow
/etc/cron.deny
使用规则
crontab 参数
crontab 文件格式
特殊用法
使用技巧与思路扩展:
步骤
示例
一.计划任务概念解析
计划任务在计算机领域指的是预先设定的任务,按照指定的时间或条件自动执行。它们通常用于自动化重复性操作、系统维护、数据备份、系统监控、报告生成等。计划任务的核心概念包括以下几个方面:
时间表
计划任务需要指定何时执行任务。时间表可以是固定的时间点,也可以是基于某些条件的动态时间。最常用的方式是基于日期和时间的调度,这种情况下,任务可能每天、每周、每月、甚至每年运行。
自动化
计划任务的主要目的是自动化操作,这样可以减少人工干预,提高效率,降低人为错误的风险。计划任务可以执行脚本、程序、命令等,确保系统按预期运行。
任务的重复性
计划任务通常是周期性的。这意味着任务可能每天、每周、每月甚至每年运行。任务重复的频率取决于实际需求。
任务执行环境
计划任务执行时需要在特定环境中运行,包括用户权限、运行路径、环境变量等。这些环境参数在计划任务中设置后会影响任务的执行效果。
二.Liunx计划任务管理工具
在Linux系统中,主要有两个工具用于管理计划任务:cron和at。 RHEL6系统中默认已安装了at、crontab软件包,通过atd和crond这两个系统服务实现一次性、周期性计划任务的功能,并分别通过at、crontab命令进行计划任务设置。
1. at命令
at
命令是用来在指定的时间执行一次相应的命令或任务。也就是说,这是一种单次的、一次性的命令调度。你可以使用任何可以解析为特定时间的字符串来调度任务。在这之前,我们学习使用centos7系统默认没有拉at的包,因此我们需要下载并启动服务。
yum install at -y #下载
systemctl start atd #启动服务
systemctl enable atd #开机自启
基本语法
at [选项] [时间]
选项
:用于控制at
命令的行为。包括读取任务来源、发送邮件等。时间
:指定任务执行的时间。可以使用各种格式,如绝对时间、相对时间、日期等。
时间格式
at
命令的时间参数可以接受多种格式。常见的时间指定方式包括:
绝对时间
- 小时:分钟:指定任务执行的具体时间。例如,
14:00
表示下午2点。 - 小时:分钟 [AM/PM]:指定上午或下午。例如,
2pm
表示下午2点。
相对时间
- now + 时间量:以当前时间为基准,增加一定的时间量。例如,
now + 1 hour
表示一小时后执行任务。 - now + 天数 days:表示从现在起若干天后。例如,
now + 2 days
表示两天后。
日期
- 日期/时间:指定特定日期和时间。例如,
12:30 12/25/2024
表示在2024年12月25日中午12:30执行任务。 - 明天或后天:可以使用
tomorrow
或yesterday
。例如,3pm tomorrow
表示明天下午3点。 - 星期几:可以使用星期几的名称。例如,
next Monday
表示下周一。
常用选项
-f filename
:从文件中读取任务。-m
:任务执行完成后发送邮件给任务所有者。-l
或atq
:列出当前用户的计划任务。-c job_number
:查看特定任务的详细信息。-d job_number
或atrm job_number
:删除指定任务。
以下是一些at
命令的示例:
在1小时后执行任务
echo "echo 'Hello, World!'" | at now + 1 hour在下午2点执行任务
echo "echo 'Running at 2pm'" | at 2pm在明天下午3点执行任务
echo "echo 'Task for tomorrow'" | at 3pm tomorrow从文件中读取任务
echo -e "echo 'Task 1'\necho 'Task 2'" > /tmp/my_tasks
at -f /tmp/my_tasks 9am以上是编写任务的一种方式
实际上我们也可以通过直接输入命令,使用ctrl+d 结束
[root@localhost ~]# at now + 1 hour #在一小时后执行任务
at> echo 'Hello, World!'
at> <EOT> #这行在我们输入命令结束后,使用ctrl+d结束编辑即可,就会出现这样的标识
job 2 at Fri May 10 00:10:00 2024
[root@localhost ~]# 查看当前用户的计划任务
[root@localhost ~]# atq
1 Fri May 10 00:07:00 2024 a root
2 Fri May 10 00:10:00 2024 a root
#第一列是任务编号。在您提供的输出中,任务编号为1和2。这是用来标识计划任务的唯一标识符。
#第二、第三和第四列表示任务的计划执行时间。
#第五列为任务状态。字母a表示任务已安排且正在等待执行。这是默认状态
#最后一列是任务的所有者。查看特定任务的详细信息
at -c 1 #1就是任务编号删除计划任务
atrm 1 #1就是任务编号
2. crontab命令
crontab
命令则用于执行周期性的任务。你可以设定一个任务在每天、每周、每月的特定时间执行。crontab的配置文件被分为6个字段,分别表示分钟(0-59)、小时(0-23)、一个月中的某日(1-31)、月份(1-12)、一周中的某日(0-7,0和7都表示星期日)、以及需要执行的命令。
crontab
文件
每个用户可以拥有自己的crontab
文件,用于定义定时任务。系统还有一个全局crontab
文件,通常位于 /etc/crontab
,用于定义系统级任务。CentOS/RHEL:在这些系统中,crontab
文件存储在 /var/spool/cron/
。这个目录下会有对应于各个用户的crontab
文件。当然,不同的liunx发行版这个路径可能会有不同。
[root@localhost ~]# crontab -u root -e #指定root用户编辑计划任务
crontab: installing new crontab
[root@localhost ~]# crontab -u lzz -e #指定普通用户编辑拉计划任务
crontab: installing new crontab
[root@localhost ~]# cd /var/spool/cron/
[root@localhost cron]# ll
总用量 8 #这里看到的就是用指定用户的名字命名的计划任务的文件拉
-rw------- 1 root root 25 5月 10 00:00 lzz
-rw------- 1 root root 23 5月 10 00:00 root
[root@localhost cron]# cat root
2 * * * * echo "hello"
使用者权限文件:
/etc/cron.allow
- 这个文件用于明确允许哪些用户可以使用
crontab
。 - 如果该文件存在,那么只有其中列出的用户才被允许使用
crontab
。未列出的用户将被禁止。 - 文件中每一行包含一个用户名。例如,如果
/etc/cron.allow
包含:
这意味着只有root alice
root
和alice
被允许使用crontab
。
/etc/cron.deny
- 这个文件用于明确禁止哪些用户使用
crontab
。 - 如果
/etc/cron.allow
不存在,那么系统将查看/etc/cron.deny
。所有不在此文件中的用户都可以使用crontab
。 - 文件中每一行包含一个用户名。例如,如果
/etc/cron.deny
包含:
这意味着bob charlie
bob
和charlie
被禁止使用crontab
,而其他用户都可以使用。
使用规则
- 如果存在
/etc/cron.allow
,则只有其中列出的用户可以使用crontab
,/etc/cron.deny
将被忽略。 - 如果
/etc/cron.allow
不存在,但存在/etc/cron.deny
,则所有不在/etc/cron.deny
中的用户都可以使用crontab
。 - 如果这两个文件都不存在,则所有用户都可以使用
crontab
(通常只受系统权限的限制)。
crontab 参数
crontab
命令有几个常用选项:
crontab -e
:编辑当前用户的crontab
文件。crontab -l
:列出当前用户的crontab
任务。crontab -r
:删除当前用户的crontab
任务。crontab -u USERNAME
:操作指定用户的crontab
(需要管理员权限)。
编辑crontab文件
要编辑当前用户的crontab文件,使用以下命令:
crontab -e编辑指定用户的crontab:-u选项通常用于指定特定用户,而后续应该带上其他操作参数或文件名。
crontab -u lzz -e查看crontab任务
要查看当前用户的crontab任务,可以使用:
crontab -l删除当前用户的crontab
如果您想删除当前用户的整个crontab文件,可以使用以下命令:
crontab -r
这个命令会删除当前用户的所有定时任务,并且没有确认提示。因此,使用此命令时要小心,因为删除后将无法恢复。删除其他用户的crontab
如果是系统管理员并想删除其他用户的crontab,可以指定用户名。请确保有适当的权限。以下命令删除指定用户的crontab:
crontab -u 用户名 -r删除crontab中的特定任务
要删除crontab中的特定任务,最佳方法是编辑crontab文件并移除相应的行。建议在删除任务前备份crontab文件。如果需要备份当前用户的crontab,可以使用以下命令导出到文件:
crontab -l > crontab_backup.txt
这样,即使意外删除了任务,您也可以通过导入备份来恢复:
crontab crontab_backup.txt
crontab
文件格式
crontab
文件的每一行代表一个任务,格式如下:
分钟 小时 日 月 星期 命令
- 分钟:0到59
- 小时:0到23
- 日:1到31
- 月:1到12
- 星期:0到7(0和7都表示星期天)
此外,还有一些特殊的符号和用法:
*
:匹配任何值。,
:指定多个值,例如1,15
表示第1和第15分钟。-
:指定范围,例如1-5
表示从1到5。/
:指定步长,例如*/5
表示每5分钟。
每天早上8点执行任务
0 8 * * * /path/to/your/script.sh
这将在每天早上8点执行指定的脚本。每周一上午9点执行任务
0 9 * * 1 /path/to/weekly/script.sh
这将在每周一上午9点运行。每5分钟执行一次任务
*/5 * * * * /path/to/frequent/task.sh
这将在每5分钟执行一次任务。每个月1号中午12点执行任务
0 12 1 * * /path/to/monthly/task.sh
这将在每月的1号中午12点执行。特定日期的特定时间执行任务
0 14 15 7 * /path/to/specific/task.sh
想验证自己设定的结果,可以用一些在线工具查看crontab的结果,这里附上三个地址
crontab执行时间计算 - 在线工具
在线crontab表达式执行时间计算工具_蛙蛙工具
Cron - 在线Cron表达式生成器
特殊用法
- 使用
@
语法:可以使用特殊的字符串表示常见的时间配置。@reboot
:在系统启动时运行。@yearly
或@annually
:每年执行一次。@monthly
:每月执行一次。@weekly
:每周执行一次。@daily
或@midnight
:每天执行一次。@hourly
:每小时执行一次。
以下是系统启动时运行的示例:
@reboot /path/to/startup/task.sh
使用技巧与思路扩展:
要在每月的最后一天执行特定命令,最常见的方式是使用crontab
中的定时任务。由于每个月的天数不固定,直接用crontab
无法简单地指定每月的最后一天。需要使用一种技巧来实现这一目标。
可以在crontab
中设置一个每天运行的任务,然后用脚本判断是否是当月的最后一天。如果是,则执行特定命令。
步骤
- 设置定时任务:在
crontab
中设置一个每天在固定时间执行的任务。 - 判断是否是最后一天:在任务中编写逻辑,判断当天是否是当月的最后一天。
- 执行特定命令:如果是最后一天,则执行特定命令。
示例
以下是一个示例,说明如何在每月的最后一天执行特定命令。在这个例子中,每天晚上11:59运行一个脚本,然后检查是否是当月的最后一天。
-
编辑
crontab
: 使用crontab -e
来编辑crontab
文件。 -
设置定时任务: 在
crontab
中添加以下行,每天晚上11:59执行一个检查脚本:59 23 * * * /path/to/check_last_day.sh #当然这个时间点可以设置成任意的时间点去判断,只要这个时间点不影响你执行时间即可
-
编写检查脚本: 创建一个脚本
/path/to/check_last_day.sh
,用来判断当天是否是当月的最后一天。如果是,则执行特定命令。#!/bin/bash# 获取明天的日期 tomorrow=$(date -d "tomorrow" +%d)# 如果明天的日期是1,表示今天是当月的最后一天 if [ "$tomorrow" -eq 1 ]; then# 如果是最后一天,执行特定命令/path/to/your/command.sh fi
-
添加执行权限: 确保脚本有执行权限:
chmod +x /path/to/check_last_day.sh