Liunx计划任务

目录

一.计划任务概念解析

二.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执行任务。
  • 明天或后天:可以使用tomorrowyesterday。例如,3pm tomorrow表示明天下午3点。
  • 星期几:可以使用星期几的名称。例如,next Monday表示下周一。

常用选项

  • -f filename:从文件中读取任务。
  • -m:任务执行完成后发送邮件给任务所有者。
  • -latq:列出当前用户的计划任务。
  • -c job_number:查看特定任务的详细信息。
  • -d job_numberatrm 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
    这意味着只有 rootalice 被允许使用 crontab
/etc/cron.deny
  • 这个文件用于明确禁止哪些用户使用 crontab
  • 如果 /etc/cron.allow 不存在,那么系统将查看 /etc/cron.deny。所有不在此文件中的用户都可以使用 crontab
  • 文件中每一行包含一个用户名。例如,如果 /etc/cron.deny 包含:
    bob 
    charlie
    这意味着 bobcharlie 被禁止使用 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中设置一个每天运行的任务,然后用脚本判断是否是当月的最后一天。如果是,则执行特定命令。

步骤
  1. 设置定时任务:在crontab中设置一个每天在固定时间执行的任务。
  2. 判断是否是最后一天:在任务中编写逻辑,判断当天是否是当月的最后一天。
  3. 执行特定命令:如果是最后一天,则执行特定命令。
示例

以下是一个示例,说明如何在每月的最后一天执行特定命令。在这个例子中,每天晚上11:59运行一个脚本,然后检查是否是当月的最后一天。

  1. 编辑crontab: 使用crontab -e来编辑crontab文件。

  2. 设置定时任务: 在crontab中添加以下行,每天晚上11:59执行一个检查脚本:

    59 23 * * * /path/to/check_last_day.sh
    #当然这个时间点可以设置成任意的时间点去判断,只要这个时间点不影响你执行时间即可
  3. 编写检查脚本: 创建一个脚本/path/to/check_last_day.sh,用来判断当天是否是当月的最后一天。如果是,则执行特定命令。

    #!/bin/bash
    
    
    # 获取明天的日期
    tomorrow=$(date -d "tomorrow" +%d)   #可简写 tomorrow=$(date -d 1day +%d)
    
    # 如果明天的日期是1,表示今天是当月的最后一天
    if [ "$tomorrow" -eq 1 ]; then
        # 如果是最后一天,执行特定命令
        /path/to/your/command.sh
    fi
    
  4. 添加执行权限: 确保脚本有执行权限:

    chmod +x /path/to/check_last_day.sh

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值