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 
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> 
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> 
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

你可能感兴趣的:(linux)