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:0017:20 tomorrow
,明天17:20HH:MM[am|pm] + number [minutes|hours|days|weeks]
从现在开始多长时间之后才进行该项任务
now + 5 minutes
,从现在开始五分钟后02pm + 3 days
,三天后的下午2:00
at任务执行方式
交互式
[root@centos6 ~]# at 12:00
at> ifconfig
at>
job 1 at 2017-08-24 12:00输入重定向
[root@centos6 ~]# at 15:00 << END
ifconfig
echo hello haiyun
END
job 2 at 2017-08-24 15:00at –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
注意事项:
atm -m
命令,当任务被完成之后,将给用户发送邮件,即使没有标准输出。因为有些命令是没有标准输出的如:useradd
,那么如果我们计划任务中写useradd添加用户,我们是看不到输出的,邮件也没有,此时-m
选项就可以强制用户发送邮件。- 计划任务中,要使用绝对路径
at.allow
要比at.deny
优先级高。如果两个文件同时存在的话,那么at.allow
生效。如果都不存在,那么就只有root用户可以使用atat
命令是有SUID
权限的
[root@centos6 ~]# ll /usr/bin/at
-rwsr-xr-x. 1 root root 54464 Mar 22 08:13 /usr/bin/at