at命令

来源:互联网 发布:淘宝网手动碎 菜机 编辑:程序博客网 时间:2024/06/05 08:25

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        : atVersion     : 3.1.13Release     : 22.el7Architecture: x86_64Install Date: Wed 23 Aug 2017 09:45:15 AM CSTGroup       : System Environment/DaemonsSize        : 97524License     : GPLv3+ and GPLv2+ and ISC and MIT and Public DomainSignature   : RSA/SHA256, Mon 21 Nov 2016 01:07:58 AM CST, Key ID 24c6a8a7f4a80eb5Source RPM  : at-3.1.13-22.el7.src.rpmBuild Date  : Sun 06 Nov 2016 02:16:27 AM CSTBuild Host  : worker1.bsys.centos.orgRelocations : (not relocatable)Packager    : CentOS BuildSystem <http://bugs.centos.org>Vendor      : CentOSURL         : http://ftp.debian.org/debian/pool/main/a/atSummary     : Job spooling toolsDescription :At and batch read commands from standard input or from a specifiedfile. At allows you to specify that a command will be run at aparticular time. Batch will execute commands when the system loadlevels drop to a particular level. Both commands use user's shell.You should install the at package if you need a utility fortime-oriented job control. Note: If it is a recurring job that willneed to be repeated at the same time every day/week, etc. you shoulduse crontab instead.

范例

范例一:

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

[root@centos6 ~]# at now + 5 minutes        <==记得加sat> /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 0umask 22HOSTNAME=centos6.haiyun.com; export HOSTNAMESELINUX_ROLE_REQUESTED=; export SELINUX_ROLE_REQUESTEDSHELL=/bin/bash; export SHELLHISTSIZE=1000; export HISTSIZESSH_CLIENT=192.168.8.1\ 60005\ 22; export SSH_CLIENTSELINUX_USE_CURRENT_RANGE=; export SELINUX_USE_CURRENT_RANGESSH_TTY=/dev/pts/0; export SSH_TTYUSER=root; export USER。。。此处省略一些环境变量MAIL=/var/spool/mail/root; export MAILPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin; export PATHPWD=/root; export PWDLANG=en_US.UTF-8; export LANGSELINUX_LEVEL_REQUESTED=; export SELINUX_LEVEL_REQUESTEDHISTCONTROL=ignoredups; export HISTCONTROLSHLVL=1; export SHLVLHOME=/root; export HOMELOGNAME=root; export LOGNAMECVS_RSH=ssh; export CVS_RSHSSH_CONNECTION=192.168.8.1\ 60005\ 192.168.8.128\ 22; export SSH_CONNECTIONLESSOPEN=||/usr/bin/lesspipe.sh\ %s; export LESSOPENG_BROKEN_FILENAMES=1; export G_BROKEN_FILENAMEScd /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-08at> /sbin/poweroff at> <EOT>job 7 at 2017-10-08 20:00

范例四:

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

[root@centos6 ~]# at -l         <==查看计划任务列表1   2017-08-24 12:00 a root7   2017-10-08 20:00 a root3   2017-08-24 12:00 a root2   2017-08-24 15:00 a root[root@centos6 ~]# at -d 7       <==删除计划任务7[root@centos6 ~]# at -l         <==再次查看已被删除1   2017-08-24 12:00 a root3   2017-08-24 12:00 a root2   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