at命令

at命令简介

Linux at命令可以让使用者指定在 TIME 这个特定时刻执行某个程序或指令

语法

at [option] TIME

常用选项

-V 显示版本信息:
-l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm
-c: 查看具体作业任务
-f /path/from/somefile:从指定的文件中读取任务
-m:当任务被完成之后,将给用户发送邮件,即使没有标准输出
  • 注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户

TIME: 定义出什么时候进行 at 这项任务的时间

HH:MM [YYYY-mm-dd]
    noon(中午12:00), midnight(午夜00:00), teatime(4pm,下午4:00)
    tomorrow(明天)
    now+#{minutes,hours,days, OR weeks},从现在开始多长时间之后

时间格式

  • HH:MM 02:00

    在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务

  • HH:MM YYYY-MM-DD 02:00 2016-09-20

    规定在某年某月的某一天的特殊时刻进行该项任务

  • HH:MM[am|pm] [Month] [Date]

    04pm March 17,3月17日下午4:00

    17:20 tomorrow,明天17:20

  • HH:MM[am|pm] + number [minutes|hours|days|weeks]

    从现在开始多长时间之后才进行该项任务

    now + 5 minutes,从现在开始五分钟后

    02pm + 3 days,三天后的下午2:00

at任务执行方式

  1. 交互式

    [root@centos6 ~]# at 12:00
    at> ifconfig
    at>
    job 1 at 2017-08-24 12:00

  2. 输入重定向

    [root@centos6 ~]# at 15:00 << END

    ifconfig
    echo hello haiyun
    END
    job 2 at 2017-08-24 15:00

  3. at –f 文件

    [root@centos6 ~]# echo ifconfig > at.txt
    [root@centos6 ~]# at 12:00 -f at.txt
    job 3 at 2017-08-24 12:00

/etc/at.{allow,deny}控制用户是否能执行at任务

/etc/at.{allow,deny}控制用户是否能执行at任务

  • 白名单: /etc/at.allow 默认不存在,需要手动创建,只有该文件中的用户才能执行at命令,如果有at.allow文件那么/etc/at.deny将会失效

  • 黑名单: /etc/at.deny 默认存在,拒绝该文件中用户执行

  • at命令, 而没有在at.deny 文件中的使用者则可执行

  • 如果两个文件都不存在,只有 root 可以执行 at 命令

at工作原理

事实上,我们使用at这个命令来生成所要运行的工作,并将这个工作以文本文件的方式写入/var/spool/at目录内,该工作便能等待atd这个服务的去用与执行了。

at队列存放在/var/spool/at目录中

atd的启动

  • 依赖与atd服务,需要启动才能实现at任务
  • centos 6:

    [root@centos6 ~]# service atd start

  • centos 7:

    [root@centos7 ~]# systemctl start atd

查看是否安装at包

[root@centos7 ~]# rpm -q at         <==查看at包是否安装
at-3.1.13-22.el7.x86_64

[root@centos7 ~]# rpm -ql at        <==查看at安装完成后生成的所有文件
/etc/at.deny
/etc/pam.d/atd
/etc/sysconfig/atd
/usr/bin/at
/usr/bin/atq
/usr/bin/atrm
/usr/bin/batch
/usr/lib/systemd/system/atd.service
/usr/sbin/atd
/usr/sbin/atrun
/usr/share/doc/at-3.1.13
/usr/share/doc/at-3.1.13/ChangeLog
/usr/share/doc/at-3.1.13/Copyright
/usr/share/doc/at-3.1.13/Problems
/usr/share/doc/at-3.1.13/README
/usr/share/doc/at-3.1.13/timespec
/usr/share/man/man1/at.1.gz
/usr/share/man/man1/atq.1.gz
/usr/share/man/man1/atrm.1.gz
/usr/share/man/man1/batch.1.gz
/usr/share/man/man5/at.allow.5.gz
/usr/share/man/man5/at.deny.5.gz
/usr/share/man/man8/atd.8.gz
/usr/share/man/man8/atrun.8.gz
/var/spool/at
/var/spool/at/.SEQ
/var/spool/at/spool

[root@centos7 ~]# rpm -qi at        <==查看at包的相关信息
Name        : at
Version     : 3.1.13
Release     : 22.el7
Architecture: x86_64
Install Date: Wed 23 Aug 2017 09:45:15 AM CST
Group       : System Environment/Daemons
Size        : 97524
License     : GPLv3+ and GPLv2+ and ISC and MIT and Public Domain
Signature   : RSA/SHA256, Mon 21 Nov 2016 01:07:58 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : at-3.1.13-22.el7.src.rpm
Build Date  : Sun 06 Nov 2016 02:16:27 AM CST
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://ftp.debian.org/debian/pool/main/a/at
Summary     : Job spooling tools
Description :
At and batch read commands from standard input or from a specified
file. At allows you to specify that a command will be run at a
particular time. Batch will execute commands when the system load
levels drop to a particular level. Both commands use user's shell.

You should install the at package if you need a utility for
time-oriented job control. Note: If it is a recurring job that will
need to be repeated at the same time every day/week, etc. you should
use crontab instead.

范例

范例一:

再过5分钟后,将/root/.bashrc寄给root自己

[root@centos6 ~]# at now + 5 minutes        <==记得加s
at> /bin/mail/ root -s "testing at job" < /root/.bashrc     <==尽量写绝对路径,因为计划任务的PATH(环境变量)和我们当前bash的PATH是有区别的
at> <EOT>
job 6 at 2017-08-23 16:49
范例二:

将上述的第6项工作内容列出来查阅

[root@centos6 ~]# at -c 6
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
HOSTNAME=centos6.haiyun.com; export HOSTNAME
SELINUX_ROLE_REQUESTED=; export SELINUX_ROLE_REQUESTED
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
SSH_CLIENT=192.168.8.1\ 60005\ 22; export SSH_CLIENT
SELINUX_USE_CURRENT_RANGE=; export SELINUX_USE_CURRENT_RANGE
SSH_TTY=/dev/pts/0; export SSH_TTY
USER=root; export USER
。。。此处省略一些环境变量
MAIL=/var/spool/mail/root; export MAIL
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin; export PATH
PWD=/root; export PWD
LANG=en_US.UTF-8; export LANG
SELINUX_LEVEL_REQUESTED=; export SELINUX_LEVEL_REQUESTED
HISTCONTROL=ignoredups; export HISTCONTROL
SHLVL=1; export SHLVL
HOME=/root; export HOME
LOGNAME=root; export LOGNAME
CVS_RSH=ssh; export CVS_RSH
SSH_CONNECTION=192.168.8.1\ 60005\ 192.168.8.128\ 22; export SSH_CONNECTION
LESSOPEN=||/usr/bin/lesspipe.sh\ %s; export LESSOPEN
G_BROKEN_FILENAMES=1; export G_BROKEN_FILENAMES
cd /root || {
     echo 'Execution directory inaccessible' >&2
     exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER2eb18f7b'
/bin/mail/ root -s "testing at job" < /root/.bashrc     <==命令

marcinDELIMITER2eb18f7b
范例三:

计划在2017-10-08 20:00关机

[root@centos6 ~]# at 20:00 2017-10-08
at> /sbin/poweroff 
at> <EOT>
job 7 at 2017-10-08 20:00
范例四:

删除上面刚刚创建的计划任务

[root@centos6 ~]# at -l         <==查看计划任务列表
1   2017-08-24 12:00 a root
7   2017-10-08 20:00 a root
3   2017-08-24 12:00 a root
2   2017-08-24 15:00 a root
[root@centos6 ~]# at -d 7       <==删除计划任务7
[root@centos6 ~]# at -l         <==再次查看已被删除
1   2017-08-24 12:00 a root
3   2017-08-24 12:00 a root
2   2017-08-24 15:00 a root

注意事项:

  1. atm -m 命令,当任务被完成之后,将给用户发送邮件,即使没有标准输出。因为有些命令是没有标准输出的如:useradd,那么如果我们计划任务中写useradd添加用户,我们是看不到输出的,邮件也没有,此时-m选项就可以强制用户发送邮件。
  2. 计划任务中,要使用绝对路径
  3. at.allow要比at.deny优先级高。如果两个文件同时存在的话,那么at.allow生效。如果都不存在,那么就只有root用户可以使用at
  4. at命令是有SUID权限的
[root@centos6 ~]# ll /usr/bin/at
-rwsr-xr-x. 1 root root 54464 Mar 22 08:13 /usr/bin/at
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
at命令的用法 At 列出在指定的时间和日期在计算机上运行的已计划命令或计划命令和程序。必须正在运行“计划”服务才能使用 at 命令。 at [\\computername] [[id] [/delete] | /delete [/yes]] at [\\computername] time [/interactive] [/every:date[,...]| /next:date[,...]] command 参数 无 如果在没有参数的情况下使用,则 at 列出已计划的命令。 \\computername 指定远程计算机。如果省略该参数,命令将安排在本地计算机。 id 指定指派给已计划命令的识别码。 /delete 取消已计划的命令。如果省略了 id,计算机中已计划的命令将被全部取消。 /yes 当删除已计划的事件时,对系统的查询强制进行肯定的回答。 time 指定运行命令的时间。将时间以 24 小时标记(00:00 [午夜] 到 23:59)的方式表示为小时:分钟。 /interactive 允许作业与在作业运行时登录用户的桌面进行交互。 /every:date[,...] 在每个星期或月的指定日期(例如,每个星期四,或每月的第三天)运行命令。将 date 指定为星期的一天或多天 (M,T,W,Th,F,S,Su),或月的一天或多天(使用 1 到 31 的数字)。用逗号分隔多个日期项。如果省略了 date,将假定为该月的当前日期。 /next:date[,...] 在重复出现下一天(例如,下个星期四)时,运行指定命令将 date 指定为星期的一天或多天 (M,T,W,Th,F,S,Su),或月的一天或多天(使用 1 到 31 的数字)。用逗号分隔多个日期项。如果省略了 date,将假定为该月的当前日期。 command 指定要运行的 Windows 2000 命令、程序(.exe 或 .com 文件)或批处理程序(.bat 或 .cmd 文件)。当命令需要路径作为参数时,请使用绝对路径,也就是从驱动器号开始的整个路径。如果命令在远程计算机上,请指定服务器和共享名的 UNC 符号,而不是远程驱动器号。如果命令不是可执行 (.exe) 文件,必须在命令前加上 cmd /c,例如: cmd /c dir > c:\test.out

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值