定时任务是在服务器上常用到的一个工作。

在你指定的时间,系统会自动执行你指定的程序(脚本或者命令)。

Linxu系统中的定时任务不难,关键是如何写出正确的脚本。

在Linxu系统中,有三种用于任务调度的工具:

  • at命令调用atd服务
  • crontab命令调用cron(crond)服务。
  • anacron工具。

只执行一次的定时任务需使用at命令。

at命令是一次性执行的定时任务。也就是说我在之后什么时间点,执行一次任务。

1、at服务管理

at命令要想正确执行,需要atd服务的支持。

atd服务是独立的服务,所以启动的命令如下:

[root@localhost ~]# service atd start

提示:

只要你的Linux系统是安装的,哪怕是最小化安装,at命令和cron命令默认都是启动的。

我们发现大多数服务最后都有个d,这个d代表Daemon(守护进程)的意思。

# 查看Linux系统中的进程
# 注意:第二行/usr/sbin/atd,才是atd服务。
[root@localhost ~]# ps aux | grep atd
rpcuser 1425 0.0 0.0 23352 1380 ? Ss 06:15 0:00 rpc.statd
root 1881 0.0 0.0 21108 496 ? Ss 06:15 0:00 /usr/sbin/atd
root 3332 0.0 0.0 103332 852 pts/2 S+ 09:29 0:00 grep atd

如果想要让atd服务开机时自动启动,可以设置如下命令:

[root@localhost ~]# chkconfig atd on

2、at命令的访问控制

atd服务启动之后,at命令才可以正常使用,我们还要学习下at命令的访问控制。

这里的访问控制指的是允许哪些用户使用at命令设定定时任务,或者不允许哪些用户使用at命令。

大家可以想象成为设定黑名单或设定白名单,这样更容易理解。at的访问控制是依靠/etc/at.allow文件(白名单)和/etc/at.deny文件(黑名单)这两个文件来实现的。

注意:Linux系统中默认是没有/etc/at.allow文件的,用到的时候需要自己手动创建。

具体规则如下:

  1. 如果系统中有/etc/at.allow文件,那么只有写入/etc/at.allow文件(白名单)中的用户可以使用at命令,其他用户不能使用at命令(/etc/at.deny文件会被忽略,也就是说同一个用户既写入/etc/at.allow文件,也写入/etc/at.deny文件,那么这个用户是可以使用at命令的,因为/etc/at.allow文件优先级更高。)。
  2. 如果系统中没有/etc/at.allow文件,只有/etc/at.deny文件,那么写入/etc/at.deny文件(黑名单)中的用户不能使用at命令,其他用户可以使用at命令。不过这个文件对root用户不生效。
  3. 如果系统中这两个文件都不存在,那么只有root用户可以使用at命令。
  4. 系统中默认时只有/etc/at.deny文件,而且这个文件是空的,这样的话系统中所有的用户都可以使用at命令。不过如果我们打算控制用户的at命令权限,把用户写入/etc/at.deny文件即可。
  5. /etc/at.allow文件的权限更高,如果/etc/at.allow文件存在,则/etc/at.deny文件失效。

    /etc/at.allow管理行为更加严格,因为只有写入这个文件的用户才能使用at命令,如果需要禁用at命令的用户较多,则可以把少数用户写入这个文件。

    /etc/at.deny文件的管理较为松散,如果允许使用at命令的用户较多,则可以把禁用的用户写入这个文件。

    不过这两个文件都不能对root用户生效。

3、at命令

格式如下:

[root@localhost ~]# at [选项] 时间

选项:
-m:当at命令工作完成后,无论是否命令有输出,都用email通知执行at命令的用户。
-c工作号:显示该at工作的实际内容。 时间:
at支持的时间格式如下:
HH:ММ 在指定的“小时:分钟”执行命令,例如:05:30。
HH:MM YYYY-MM-DD 在指定的“小时:分钟 年-月-日”执行,例如05:30 2020-06-26。
HH:MM[am|pm][month][date] 在指定的“小时:分钟[上午|下午][月][日]“执行,例如05:30 July 25。
HH:MM[amlpm]+[minutes|hours|days|weeks] 在指定的时间“再加多久执行”,
例now + 5 minutes,05am + 2 hours。

at命令只要指定正确的时间,就可以输入需要在指定时间执行的命令了.这个命令可以是系统令,也可以是shell脚本。(也就是说确认命令的执行时间之后,按回车在输入你要执行的命令。)

示例:

# 1.编写一个shell脚本hello.sh
[root@localhost ~]# cat /root/hello. sh
#!/bin/bash
echo "hello world!!!!" # 2.使用at命令在某个时间点执行该脚本
[root@localhost ~]# at now + 2 minutes
# 回车后,输入需要执行的命令
# 把hello.sh脚本输入的内容,写入指定的文件中
at> /root/hello.sh >> /root/hello.log
# 使用ctrltd 保存at任务
at> <EOT>
job 1 at 2020-06-25 18:58
# 会提示你,第1个at任务,会在2020年6月25日18:58分执行
# 这个1代表工作号

查询指定的定时任务:

# 查询第1个at任务的内容
# 可以看到at执行的任务内容
[root@localhost ~]# at -c 1(工作号)
# 可以看到有很多的内容
# 前面主要是定义系统的环境变量
# 最后面的
/root/hello.sh >>/root/hel1o.1og

提示:

我们可以通过下面的atq命令查看到,Linux系统中at任务列表中,你所需要任务的工作号,然后在通过at -c (工作号)命令来查看一个at任务的具体内容。

在一个at任务中执行多个系统命令:

# 在指定的时间关机。
[root@localhost ~]# at 02:00 2020-06-26
at> /bin/sync
at> /sbin/shutdown -h now
at> <EOT>
job 1 at 2020-06-26 02:00

4、其他at管理命令

at还有查询(atq)命令和删除(atrm)命令。

命令如下:

# 1.查询当前服务器上的at工作
[root@localhost ~]# atq 例如:
# 说明:root用户有一个at在务在2020年6月25日的18:58执行,工作号是1
[root@localhost ~]# atq
1 2020-06-25 18:58 a root
# 通过atq命令查看at定时任务,只能看到工作号,执行时间,哪个用户执行
# 但是看不到具体执行的命令是什么, # 2.删除指定的at在务
[root@localhost ~]# atrm [工作号] 例如:
# 删除1号at任务,然后通过atq命令查询就没有at任务存在了
[root@localhost ~]# atrm 1

5、总结

at命令平时用的并不多,因为at任务只能够执行一次任务。

『学了就忘』Linux系统定时任务 — 87、只执行一次的定时任务的更多相关文章

  1. 『学了就忘』Linux系统定时任务 — 88、循环执行定时任务

    目录 1.crond服务管理与访问控制 2.crontab命令的访问控制 3.用户级别的crontab命令 4.crontab命令的注意事项 5.系统的crontab设置 (1)/etc/cronta ...

  2. 『学了就忘』Linux系统定时任务 — 89、任务调度工具anacron

    目录 1.任务调度工具anacron介绍 2.新旧版本Linux中anacron工具的区别 3./etc/cron.{daily,weekly,monthly}目录说明 4.anacron命令 5./ ...

  3. 『学了就忘』Linux基础 — 6、VMware虚拟机安装Linux系统(超详细)

    目录 1.打开VMware虚拟机软件 2.选择Linux系统的ISO安装镜像 3.开启虚拟机安装系统 (1)进入Linux系统安装界面 (2)硬件检测 (3)检测光盘 (4)欢迎界面 (5)选择语言 ...

  4. 『学了就忘』Linux基础 — 7、补充:安装Linxu系统时设置硬盘挂载说明

    目录 (1)新建一个/home分区 (2)再创建一个/boot分区. (3)创建一个swap分区 (4)最后剩余的空间全部分给根目录 (5)总结 上一篇在VMwar虚拟机中安装Linux操作系统中ht ...

  5. 『学了就忘』Linux基础 — 11、通过setup工具配置Linux系统IP地址

    目录 1.setup命令介绍 2.使用setup命令配置IP (1)执行setup命令 (2)进入图形化配置界面 (3)选择配置IP还是DNS (4)选择要配置的网卡 (5)进入IP地址配置页面 (6 ...

  6. 『学了就忘』Linux基础 — 13、Linux系统的分区和格式化

    目录 1.Linux系统的分区 (1)磁盘分区定义 (2)两种分区表形式 (3)MBR分区类型 2.Linux系统的格式化 (1)格式化定义 (2)格式化说明 1.Linux系统的分区 (1)磁盘分区 ...

  7. 『学了就忘』Linux基础 — 14、Linux系统的设备文件名和挂载

    目录 1.设备文件名 (1)为什么需要设备文件名 (2)硬件设备文件名命名规则 2.挂载点 3.挂载 (1)什么是挂载 (2)挂载前的分区要求 (3)小结(重点) 1.设备文件名 (1)为什么需要设备 ...

  8. 『学了就忘』Linux基础 — 15、了解Linux系统的目录结构

    目录 1.一级目录说明 (1)一级目录列表 (2)/bin/和/sbin/目录说明 (3)/boot/目录说明 (4)/lib/和/lib64/目录说明 (5)/lost+found/目录说明 (6) ...

  9. 『学了就忘』Linux基础 — 16、Linux系统与Windows系统的不同

    目录 1.Linux严格区分大小写 2.Linux一切皆文件 3.Linux不靠扩展名区分文件类型 4.Linux中所有的存储设备都必须在挂载之后才能使用 5.Windows下的程序不能直接在Linu ...

随机推荐

  1. Study Blazor .NET(一)简介

    翻译自:Study Blazor .NET,转载请注明. 介绍 Blazor是一个全新的 Web UI 框架,它使用c# .Razor 和 HTML以及 WebAssembly W3C标准.它提供了用 ...

  2. nrf52810/52832开发板能跑,自己的PCB不能跑的原因

    1.PCB图片对比 这是我的开发板原理图: 这是我画的PCB原理图: 发现其实开发板上就是比我的多了两个外部晶振. 例程代码一般都是用外部晶振作为时钟,所以用例程的代码跑不通我的PCB. 2.解决办法 ...

  3. 用图像识别玩Chrome断网小游戏

    先来看一下效果 正文 最近在学习机器学习方面的知识,想着做个东西玩玩,然后就接触到了TensorFlow这个机器学习框架,这个框架封装了机器学习的一些常用算法. 不过要自己实现一套流程还是比较麻烦,我 ...

  4. es使用postmain进行数据的增删改查

    es的基本安装 安装遇到的问题  java本地环境和es环境冲突 ​ https://www.cnblogs.com/q1359720840/p/14077049.html ​ ​ ,看要使用jdk1 ...

  5. .NET Core 3.0 JsonSerializer.Deserialize 返回dynamic类型对象

    .NET Core 3.0 JsonSerializer.Deserialize to dynamic object 因为官方还不支持返回动态类型的对象,只能自己手写一个,临时测试了下没问题,还有些地 ...

  6. ASP .Net Core 在 CentOS8 ARM 下连接 SQL Server 2008 R2(Hypervisor)

    本文主要记录在 ARM 系统下无法连接SQL Server 2008 R2 的解决过程. 解决方案是使用 ODBC 的方式连接数据库,进行操作. 手上有公司的华为鲲鹏云计算 ARM 架构的 CentO ...

  7. linux 网络配置管理

    [1]网络配置基础 (1)用户既可以通过命令行的方式,也可以通过友好的图形界面,轻松完成网络配置. (2)实现Linux网络配置的惟一目标就是修改系统中众多的网络配置文件, 如/etc/interfa ...

  8. lsof之列出已打开的文件

    lsof命令常用解析 Linux中常用 lsof 来查看文件调用进程等相关信息,也可用来查看活跃的进程信息和端口监听进程信息等 1. lsof 命令介绍 NAME lsof - list open f ...

  9. 一个专业处理字符串的IDEA插件

    字符串处理想必是小伙伴们平时开发时经常碰到的一个 "难题".为什么要打上引号?因为你说他难吧,其实也不是什么特别复杂的事:你说他不难吧,弄起来还真挺麻烦的,像删除其中空行啊.切换大 ...

  10. h5移动端设备像素比dpr介绍

    首先介绍一下概念 devicePixelRatio其实指的是window.devicePixelRatio window.devicePixelRatio是设备上物理像素和设备独立像素(device- ...