Linux定时任务(at,crontab)

Linux定时任务

Linux定时任务是一种自动化执行指定任务的机制。它可以在特定的时间或事件发生时自动地执行指定的命令或脚本。Linux定时任务可以用于各种不同的任务,例如备份数据、定期清理日志、定时重启服务等
Linux定时任务主要有两种类型:
一种是基于系统内置的cron服务,另一种是基于系统自带的at服务。下面我们分别来介绍这两种定时任务的使用方法。

at命令

at是定时任务工具,依赖于atd服务,适用于执行一次就结束的调度任务

例如: 凌晨3点需要临时备份数据文件等,可以使用到at

要想使用at一次性计划任务时,我们的Linux系统上面必须要有负责这个计划任务的服务,就是atd服务

有些Linux版本默认不会打开,需要我们手动打开激活服务

[root@csq ~]# systemctl start  atd
[root@csq ~]# systemctl status atd  # 查看是否运行

语法
at[参数] [时间]

参数 解释
-m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
-I atq的别名
-d atrm的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q 使用指定的列队
-f 从指定文件读入任务而不是从标准输入读入
-t 以时间参数的形式提交要运行的任务

at使用的指定时间也比较复杂

可以使用当前时间,或者第二天时间来表示例如:

  • hh/mm (小时 分钟)
  • day/hh/mm (日 小时 分钟)
  • tomorrow (明天)

可以使用单词来指定时间例如:

  • midnight(深夜)

  • noon(中午)

  • teatime(饮茶时间,下午4点)

还可以采用12小时制上下午来表示:

  • AM(上午)

  • PM(下午)

也能够使用命令执行的具体日期

  • month day (月 日)
  • yy/mm/dd(年 月 日)

上面介绍的都是绝对时间,也可以使用相对时间计时,这对于马上要执行的命令有着绝对的效率

格式: now + count time-units

now就是当前时间

count 是时间的数量,几天或几小时,today,tomorrow来指定完成命令时间

time-units:是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)

案例

一分钟后打印csq

[root@csq ~]# at now+1min 
at> echo 'csq'
at> <EOT>
job 12 at Tue Mar 21 20:38:00 2023

明天17点中,创建一个文件,把当前时间写进去

[root@csq ~]# at 17.00 tomorrow
at> date >> time.txt 
at> <EOT>
job 15 at Wed Mar 22 17:00:00 2023

计划任务设定后,在没有执行计划任务之前,我们可以使用atq命令来查看系统有没有执行工作任务

[root@csq ~]# atq
15      Wed Mar 22 17:00:00 2023 a root
[root@csq ~]# at -l
15      Wed Mar 22 17:00:00 2023 a root

显示已经设置完成的任务内容

[root@csq ~]# at -c 15

删除已经设置完成的任务

[root@csq ~]# atrm 15
[root@csq ~]# atq
[root@csq ~]# 

at的运行方式

既然是计划任务,那么应该就会有他的任务执行方式, 那么产生计划任务的方式是怎么进行的?

我们使用at这个命令产生的计划任务,并将这个计划任务以文档的方式写入/var/spool/at 目录内,该计划任务就可以等待atd服务来执行。

并不是所有人用户都可以进行at计划任务,因为如果主机被攻击破解后,黑客会在他们电脑中植入很多黑客程序,这些程序可能会使用一些计划任务来运行,来控制你的电脑获取你的信息,所以不是很安全的用户,不要让他们使用at命令。

我们可以利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制。

加上这两个文件后, at 的工作情况是这样的:
先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中)

由于假设系统上的所有用户都是可信任的, 因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允许所有人使用 at 命令的意思 (您可以自行检查一下该文件)

如果你不希望有某些使用者使用 at 的话,将那个使用者的帐号写入 /etc/at.deny 即可! 一个帐号写一行

如果两个文件都不存在,那么只有 root 可以使用 at 这个命令。

给chenshiren这个用户加入黑名单不让他使用at命令

[root@localhost home]# vi /etc/at.deny 
chenshiren
[root@localhost home]# su - chenshiren 
[chenshiren@localhost ~]$ at
You do not have permission to use at.

给chenshiren这个用户加入白名单能让他使用at命令

[root@localhost home]# vi /etc/at.allow
chenshiren
[root@localhost home]# su - chenshiren 
[chenshiren@localhost ~]$ at now+5min
at> echo 'csq'  
at> <EOT>
job 1 at Wed Mar 22 07:09:00 2023
[chenshiren@localhost ~]$ atq
1       Wed Mar 22 07:09:00 2023 a chenshiren

cron周期性定时任务

crond进程提交任务的方式与at不同,crond需要读取配置文件,且有固定的文件格式,通过crontab命令管理文件

先查看crond服务是否开启,如果没有这项服务就安装

systemctl status crond

安装crond服务

yum install -y cronie

crond服务启动

systemctl start crond  && systemctl enable crond

cron任务分为两类

系统定时任务

系统定时配置文件解析 /etc/crontab

[root@localhost home]# cat /etc/crontab 
SHELL=/bin/bash                     # 指定shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin  # 指定了系统可执行文件路径
MAILTO=root       # 指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户

....

用户定时任务

用户定期要执行的工作,比如用户数据备份、定时邮件提醒等

crontab命令

crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务

语法
crontab(选项)(参数)

选项 解释
-e edit编辑定时任务
-l list查看定时任务
-r 删除定时任务,移除/var/spool/cron/username文件
-u 指定用户执行任务,root可以管理普通用户的计划任务
-i 删除定时任务,提示用户确认删除,避免出错

参数

crontab文件:指定包含待执行任务的crontab文件

同at命令一样都可以设置使用者的使用命令权限

/etc/cron.deny     该文件中所列用户不允许使用crontab命令
/etc/cron.allow    该文件中所列用户允许使用crontab命令
/var/spool/cron/   所有用户crontab文件存放的目录,以用户名命名

crontab任务格式:

minute   hour   day   month   week   command     顺序:分 时 日 月 周
  • minute 表示分钟 可以取0~59的整数

  • hour 表示小时 可以取 0~23 (0表示0点)

  • day 表示日期 可以取 1~31

  • month 表示月份 可以取 1~12

  • week 表示星期 可以取 0~7 (0或7表示星期天)

以上各个字段,还可以使用下面的特殊字符

  • 星号 * 代表所有可能的值

  • 逗号 , 可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

  • 中杠 - 可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

  • 正斜线 / 可以用正斜线指定时间的间隔频率 例如“0-23/2”表示每两小时执行一次。

案例

每天上午8点30,去上学

30 08 * * * go to school

每一分钟执行一次

* * * * * 

每小时执行一次

00 * * * * 

每周六和周日下午 1点和2点的每一分钟斗执行

* 13,14 * * 6,0 

猜你喜欢

转载自blog.csdn.net/qq_52089863/article/details/129700963