【shell】后台执行命令-002(at)
at命令允许用户向cron守护进程提交作业,使其在稍后的时间运行。这里稍后的时间可能是指10min以后,也可能是指几天以后。如果你希望在一个月或更长的时间以后运行,最好还是使用crontab文件。
一旦一个作业被提交, at命令将会保留所有当前的环境变量,包括路径,不象crontab,只提供缺省的环境。该作业的所有输出都将以电子邮件的形式发送给用户,除非你对其输出进行了重定向,绝大多数情况下是重定向到某个文件中。
和crontab一样,根用户可以通过/etc目录下的at.allow和at.deny文件来控制哪些用户可以使用at命令,哪些用户不行。不过一般来说,对at命令的使用不如对crontab的使用限制那么严格。
at命令的基本形式为:
at [-f script] [-m -l -r] [time] [date]
其中,
-fscript 是所要提交的脚本或命令。
-l 列出当前所有等待运行的作业。a t q命令具有相同的作用。
-r 清除作业。为了清除某个作业,还要提供相应的作业标识(ID);有些UNIX变体只接受atrm作为清除命令。
-m 作业完成后给用户发邮件。
time at命令的时间格式非常灵活;可以是H、HH . HHMM、HH : MM或H: M,其中H和M分别是小时和分钟。还可以使用a.m.或p.m.。
date 日期格式可以是月份数或日期数,而且at命令还能够识别诸如today、tomorrow这样的词。
现在就让我们来看看如何提交作业。
1、 使用at命令提交命令或脚本
使用at命令提交作业有几种不同的形式,可以通过命令行方式,也可以使用at命令提示符。
一般来说在提交若干行的系统命令时,我使用at命令提示符方式,而在提交shell脚本时,使用命令行方式。
如果你想提交若干行的命令,可以在at命令后面跟上日期/时间并回车。然后就进入了at命令提示符,这时只需逐条输入相应的命令,然后按‘< CTRL-D>’退出。下面给出一个例子:
其中,<EOT>就是<CTRL-D>。在21:10系统将执行一个简单的find命令。你应当已经注意到,我所提交的作业被分配了一个唯一标识job 1。该命令在完成以后会将全部结果以邮件的形式发送给我。
下面就是我从这个邮件中截取的一部分:
下面这些日期/时间格式都是at命令可以接受的:
如果希望向at命令提交一个shell脚本,使用其命令行方式即可。在提交脚本时使用- f选项。
在上面的例子中,一个叫做db_table.的脚本将在明天下午3 : 0 0运行。
还可以使用echo命令向at命令提交作业:
$ echo find /etc-name "passwd" -print | at now +1 minute
2、列出所提交的作业
一个作业被提交后,可以使用at -l命令来列出所有的作业:
其中,第一行是作业标识,后面是作业运行的日期/时间。最后一列a代表at。还可以使用atq命令来完成同样的功能,它是at命令的一个链接。当提交一个作业后,它就被拷贝到/var/spool/at目录中,准备在要求的时间运行。
3 、清除一个作业
清除作业的命令格式为:
atrm [job no]或 at -r [job no]
要清除某个作业,首先要执行at -l命令,以获取相应的作业标识,然后对该作业标识使用at -r 命令,清除该作业。
有些系统使用at-r [jobno]命令清除作业。