3.2 at命令
a t命令允许用户向c r o n守护进程提交作业,使其在稍后的时间运行。这里稍后的时间可能
是指1 0 m i n以后,也可能是指几天以后。如果你希望在一个月或更长的时间以后运行,最好还
是使用c r o n t a b文件。
一旦一个作业被提交, a t命令将会保留所有当前的环境变量,包括路径,不象c r o n t a b,
只提供缺省的环境。该作业的所有输出都将以电子邮件的形式发送给用户,除非你对其输出
进行了重定向,绝大多数情况下是重定向到某个文件中。
和c r o n t a b一样,根用户可以通过/ e t c目录下的a t . a l l o w和a t . d e n y文件来控制哪些用户可以
第3章后台执行命令25
下载
使用a t命令,哪些用户不行。不过一般来说,对a t命令的使用不如对c r o n t a b的使用限制那么严
格。
a t命令的基本形式为:
at [-f script] [-m -l -r] [time] [date]
其中,
-f script 是所要提交的脚本或命令。
-l 列出当前所有等待运行的作业。a t q命令具有相同的作用。
-r 清除作业。为了清除某个作业,还要提供相应的作业标识( I D);有些U N I X变体只
接受a t r m作为清除命令。
-m 作业完成后给用户发邮件。
time at命令的时间格式非常灵活;可以是H、H H . H H M M、H H : M M或H : M,其中H和M
分别是小时和分钟。还可以使用a . m .或p . m .。
date 日期格式可以是月份数或日期数,而且a t命令还能够识别诸如t o d a y、t o m o r r o w这样
的词。
现在就让我们来看看如何提交作业。
3.2.1 使用at命令提交命令或脚本
使用a t命令提交作业有几种不同的形式,可以通过命令行方式,也可以使用a t命令提示符。
一般来说在提交若干行的系统命令时,我使用a t命令提示符方式,而在提交s h e l l脚本时,使用
命令行方式。
如果你想提交若干行的命令,可以在a t命令后面跟上日期/时间并回车。然后就进入了a t命
令提示符,这时只需逐条输入相应的命令,然后按‘ < C T R L - D >’退出。下面给出一个例子:
其中, < E O T >就是< C T R L - D >。在2 1 : 1 0系统将执行一个简单的f i n d命令。你应当已经注
意到,我所提交的作业被分配了一个唯一标识job 1。该命令在完成以后会将全部结果以邮件
的形式发送给我。
下面就是我从这个邮件中截取的一部分:
下面这些日期/时间格式都是a t命令可以接受的:
26 第一部分shell
下载
如果希望向a t命令提交一个s h e l l脚本,使用其命令行方式即可。在提交脚本时使用- f选项。
在上面的例子中,一个叫做d b _ t a b l e . s h的脚本将在明天下午3 : 0 0运行。
还可以使用e c h o命令向a t命令提交作业:
$ echo find /etc -name "passwd" -print | at now +1 minute
3.2.2 列出所提交的作业
一个作业被提交后,可以使用at -l命令来列出所有的作业:
其中,第一行是作业标识,后面是作业运行的日期/时间。最后一列a代表a t。还可以使用
a t q命令来完成同样的功能,它是a t命令的一个链接。当提交一个作业后,它就被拷贝到
/ v a r / s p o o l / a t目录中,准备在要求的时间运行。
3.2.3 清除一个作业
清除作业的命令格式为:
atrm [job no]或 at -r [job no]
要清除某个作业,首先要执行at -l命令,以获取相应的作业标识,然后对该作业标识使用
at -r 命令,清除该作业。
有些系统使用at-r [job no]命令清除作业。
3.3 &命令
当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。
第3章后台执行命令27
下载
可以使用&命令把作业放到后台执行。
该命令的一般形式为:
命令&
为什么要在后台执行命令?因为当在后台执行命令时,可以继续使用你的终端做其他事
情。适合在后台运行的命令有f i n d、费时的打印作业、费时的排序及一些s h e l l脚本。在后台运
行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻
等。
不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行
的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
command >out.file 2>&1 &
在上面的例子中,所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。
当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。
3.3.1 向后台提交命令
现在我们运行一个f i n d命令,查找名为“ s r m . c o n f”的文件,并把所有标准输出和错误输
出重定向到一个叫作f i n d . d t的文件中:
在上面的例子中,在我们成功提交该命令之后,系统给出了它的进程号2 7 0 1 5。
当该作业完成时,按任意键(一般是回车键)就会出现一个提示:
这里还有另外一个例子,有一个叫做p s 1的脚本,它能够截断和清除所有的日志文件,我
把它放到后台去执行:
3.3.2 用ps命令查看进程
当一个命令在后台执行的时候,可以用提交命令时所得到的进程号来监控它的运行。在
前面的例子中,我们可以按照提交p s 1时得到的进程号,用p s命令和g r e p命令列出这个进程:
如果系统不支持ps x命令,可以用:
记住,在用p s命令列出进程时,它无法确定该进程是运行在前台还是后台。
3.3.3 杀死后台进程
如果想杀死后台进程可以使用k i l l命令。当一个进程被放到后台运行时, s h e l l会给出一个
28 第一部分shell
下载
进程号,我们可以根据这个进程号,用k i l l命令杀死该进程。该命令的基本形式为:
kill -signal [process_number]
现在暂且不要考虑其中的各种不同信号;我们会在后面的章节对这一问题进行介绍。
在杀进程的时候,执行下面的命令(你的进程号可能会不同)并按回车键。系统将会给出相
应的信息告诉用户进程已经被杀死。
如果系统没有给出任何信息,告诉你进程已经被杀死,那么不妨等一会儿,也许系统正
在杀该进程,如果还没有回应,就再执行另外一个k i l l命令,这次带上一个信号选项:
如果用上述方法提交了一个后台进程,那么在退出时该进程将会被终止。为了使后台进
程能够在退出后继续运行,可以使用n o h u p命令,下面我们就介绍这一命令。
