`

Linux与unix shell编程指南_第一部分shell_第3章后台执行命令

阅读更多

第3章后台执行命令

当你在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还
有更重要的事情要做,比如阅读电子邮件。对于密集访问磁盘的进程,你可能希望它能够在
每天的非负荷高峰时间段运行。为了使这些进程能够在后台运行,也就是说不在终端屏幕上
运行,有几种选择方法可供使用。

在本章中我们将讨论:

.设置crontab文件,并用它来提交作业。
.使用at命令来提交作业。
.在后台提交作业。
.使用nohup命令提交作业。
名词解释:

cron系统调度进程。可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月
中的不同时段运行。

Atat命令。使用它在一个特定的时间运行一些特殊的作业,或在晚一些的非负荷高峰时
间段或高峰负荷时间段运行。

&使用它在后台运行一个占用时间不长的进程。

Nohup使用它在后台运行一个命令,即使在用户退出时也不受影响。

3.1cron和crontab
cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业。有一个叫做
crontab的命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件
来保存调度信息。可以使用它运行任意一个shell脚本或某个命令,每小时运行一次,或一周
三次,这完全取决于你。每一个用户都可以有自己的crontab文件,但在一个较大的系统中,
系统管理员一般会禁止这些文件,而只在整个系统保留一个这样的文件。系统管理员是通过
cron.deny和cron.allow这两个文件来禁止或允许用户拥有自己的crontab文件。

3.1.1crontab的域
为了能够在特定的时间运行作业,需要了解crontab文件每个条目中各个域的意义和格式。
下面就是这些域:

第1列分钟1~59
第2列小时1~23(0表示子夜)
第3列日1~31
第4列月1~12
第5列星期0~6(0表示星期天)
第6列要运行的命令


第3章后台执行命令23
下载
下面是crontab的格式:

分<>时<>日<>月<>星期<>要运行的命令

其中<>表示空格。

Crontab文件的一个条目是从左边读起的,第一列是分,最后一列是要运行的命令,它位
于星期的后面。

在这些域中,可以用横杠-来表示一个时间范围,例如你希望星期一至星期五运行某个作
业,那么可以在星期域使用1-5来表示。还可以在这些域中使用逗号“,”,例如你希望星期一
和星期四运行某个作业,只需要使用1,4来表示。可以用星号*来表示连续的时间段。如果你
对某个表示时间的域没有特别的限定,也应该在该域填入*。该文件的每一个条目必须含有5
个时间域,而且每个域之间要用空格分隔。该文件中所有的注释行要在行首用#来表示。

3.1.2crontab条目举例
这里有crontab文件条目的一些例子:

3021***/apps/bin/cleanup.sh


上面的例子表示每晚的21:30运行/apps/bin目录下的cleanup.sh。

4541,10,22**/apps/bin/backup.sh


上面的例子表示每月1、10、22日的4:45运行/apps/bin目录下的backup.sh。

101**6,0/bin/find-name"core"-execrm{}\
;


上面的例子表示每周六、周日的1:10运行一个find命令。

0,3018-23***/apps/bin/dbcheck.sh


上面的例子表示在每天18:00至23:00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh。

023**6/apps/bin/qtrend.sh


上面的例子表示每星期六的11:00pm运行/apps/bin目录下的qtrend.sh。

你可能已经注意到上面的例子中,每个命令都给出了绝对路径。当使用crontab运行shell
脚本时,要由用户来给出脚本的绝对路径,设置相应的环境变量。记住,既然是用户向cron
提交了这些作业,就要向cron提供所需的全部环境。不要假定cron知道所需要的特殊环境,它
其实并不知道。所以你要保证在shell脚本中提供所有必要的路径和环境变量,除了一些自动
设置的全局变量。

如果cron不能运行相应的脚本,用户将会收到一个邮件说明其中的原因。

3.1.3crontab命令选项
crontab命令的一般形式为:

Crontab[-uuser]-e-l-
r


其中:
-u用户名。
-e编辑crontab文件。
-l列出crontab文件中的内容。
-r删除crontab文件。
如果使用自己的名字登录,就不用使用-u选项,因为在执行crontab命令时,该命令能够


24第一部分shell
下载
知道当前的用户。

3.1.4创建一个新的crontab文件
在考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量
EDITOR。cron进程根据它来确定使用哪个编辑器编辑crontab文件。99%的UNIX和LINUX用
户都使用vi,如果你也是这样,那么你就编辑$HOME目录下的.profile文件,在其中加入这样
一行:

EDITOR=vi;exportEDITOR


然后保存并退出。
不妨创建一个名为<user>cron的文件,其中<user>是用户名,例如,davecron。在该文件
中加入如下的内容。


保存并退出。确信前面5个域用空格分隔。

在上面的例子中,系统将每隔15分钟向控制台输出一次当前时间。如果系统崩溃或挂起,
从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些系统中,用tty1来表
示控制台,可以根据实际情况对上面的例子进行相应的修改。

为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为cron命令的参数:

$crontabdavecron


现在该文件已经提交给cron进程,它将每隔15分钟运行一次。

同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即,
dave)。

3.1.5列出crontab文件
为了列出crontab文件,可以用:


你将会看到和上面类似的内容。可以使用这种方法在$HOME目录中对crontab文件做一备
份:

$crontab-l>$HOME/mycron


这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。

3.1.6编辑crontab文件
如果希望添加、删除或编辑crontab文件中的条目,而EDITOR环境变量又设置为vi,那么
就可以用vi来编辑crontab文件,相应的命令为:

$crontab-
e


可以像使用vi编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添


第3章后台执行命令25
下载
加了新的条目,那么在保存该文件时,cron会对其进行必要的完整性检查。如果其中的某个
域出现了超出允许范围的值,它会提示你。

我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:


现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道
它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。
现在让我们使用前面讲过的crontab-l命令列出它的全部信息:


3.1.7删除crontab文件
为了删除crontab文件,可以用:

$crontab-
r


3.1.8恢复丢失的crontab文件
如果不小心误删了crontab文件,假设你在自己的$HOME目录下还有一个备份,那么可以
将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完
成拷贝,可以用:

$crontab<filename>


其中,<filename>是你在$HOME目录中副本的文件名。

我建议你在自己的$HOME目录中保存一个该文件的副本。我就有过类似的经历,有数次
误删了crontab文件(因为r键紧挨在e键的右边.)。这就是为什么有些系统文档建议不要直接
编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。

有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选
项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按
<Ctrl-D>,否则你将丢失crontab文件。

3.2at命令
at命令允许用户向cron守护进程提交作业,使其在稍后的时间运行。这里稍后的时间可能
是指10min以后,也可能是指几天以后。如果你希望在一个月或更长的时间以后运行,最好还
是使用crontab文件。

一旦一个作业被提交,at命令将会保留所有当前的环境变量,包括路径,不象crontab,
只提供缺省的环境。该作业的所有输出都将以电子邮件的形式发送给用户,除非你对其输出
进行了重定向,绝大多数情况下是重定向到某个文件中。

和crontab一样,根用户可以通过/etc目录下的at.allow和at.deny文件来控制哪些用户可以


26第一部分shell
下载
使用at命令,哪些用户不行。不过一般来说,对at命令的使用不如对crontab的使用限制那么严
格。

at命令的基本形式为:

at[-fscript][-m-l-r][time][date]


其中,

-fscript是所要提交的脚本或命令。

-l列出当前所有等待运行的作业。atq命令具有相同的作用。

-r清除作业。为了清除某个作业,还要提供相应的作业标识(ID);有些UNIX变体只
接受atrm作为清除命令。

-m作业完成后给用户发邮件。

timeat命令的时间格式非常灵活;可以是H、HH.HHMM、HH:MM或H:M,其中H和M

分别是小时和分钟。还可以使用a.m.或p.m.。
date日期格式可以是月份数或日期数,而且at命令还能够识别诸如today、tomorrow这样
的词。
现在就让我们来看看如何提交作业。

3.2.1使用at命令提交命令或脚本
使用at命令提交作业有几种不同的形式,可以通过命令行方式,也可以使用at命令提示符。
一般来说在提交若干行的系统命令时,我使用at命令提示符方式,而在提交shell脚本时,使用
命令行方式。

如果你想提交若干行的命令,可以在at命令后面跟上日期/时间并回车。然后就进入了at命
令提示符,这时只需逐条输入相应的命令,然后按‘<CTRL-D>’退出。下面给出一个例子:


其中,<EOT>就是<CTRL-D>。在21:10系统将执行一个简单的find命令。你应当已经注
意到,我所提交的作业被分配了一个唯一标识job1。该命令在完成以后会将全部结果以邮件
的形式发送给我。

下面就是我从这个邮件中截取的一部分:


下面这些日期/时间格式都是at命令可以接受的:



第3章后台执行命令27
下载
如果希望向at命令提交一个shell脚本,使用其命令行方式即可。在提交脚本时使用-f选项。


在上面的例子中,一个叫做db_table.sh的脚本将在明天下午3:00运行。
还可以使用echo命令向at命令提交作业:

$echofind/etc-name"passwd"-print|atnow+1minute


3.2.2列出所提交的作业
一个作业被提交后,可以使用at-l命令来列出所有的作业:


其中,第一行是作业标识,后面是作业运行的日期/时间。最后一列a代表at。还可以使用
atq命令来完成同样的功能,它是at命令的一个链接。当提交一个作业后,它就被拷贝到
/var/spool/at目录中,准备在要求的时间运行。


3.2.3清除一个作业
清除作业的命令格式为:

atrm[jobno]或at-r[jobno]

要清除某个作业,首先要执行at-l命令,以获取相应的作业标识,然后对该作业标识使用
at-r命令,清除该作业。


有些系统使用at-r[jobno]命令清除作业。

3.3&命令
当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。


28第一部分shell
下载
可以使用&命令把作业放到后台执行。

该命令的一般形式为:

命令&

为什么要在后台执行命令?因为当在后台执行命令时,可以继续使用你的终端做其他事
情。适合在后台运行的命令有find、费时的打印作业、费时的排序及一些shell脚本。在后台运
行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻
等。

不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行
的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:

command>out.file2>&1
&


在上面的例子中,所有的标准输出和错误输出都将被重定向到一个叫做out.file的文件中。
当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。

3.3.1向后台提交命令
现在我们运行一个find命令,查找名为“srm.conf”的文件,并把所有标准输出和错误输
出重定向到一个叫作find.dt的文件中:


在上面的例子中,在我们成功提交该命令之后,系统给出了它的进程号27015

当该作业完成时,按任意键(一般是回车键)就会出现一个提示

 

这里还有另外一个例子,有一个叫做ps1的脚本,它能够截断和清除所有的日志文件,我
把它放到后台去执行:


3.3.2用ps命令查看进程
当一个命令在后台执行的时候,可以用提交命令时所得到的进程号来监控它的运行。在
前面的例子中,我们可以按照提交ps1时得到的进程号,用ps命令和grep命令列出这个进程:


如果系统不支持psx命令,可以用:


记住,在用ps命令列出进程时,它无法确定该进程是运行在前台还是后台。

3.3.3杀死后台进程
如果想杀死后台进程可以使用kill命令。当一个进程被放到后台运行时,shell会给出一个


第3章后台执行命令29
下载
进程号,我们可以根据这个进程号,用kill命令杀死该进程。该命令的基本形式为:

kill-signal[process_number]


现在暂且不要考虑其中的各种不同信号;我们会在后面的章节对这一问题进行介绍。
在杀进程的时候,执行下面的命令(你的进程号可能会不同)并按回车键。系统将会给出相
应的信息告诉用户进程已经被杀死。


如果系统没有给出任何信息,告诉你进程已经被杀死,那么不妨等一会儿,也许系统正
在杀该进程,如果还没有回应,就再执行另外一个kill命令,这次带上一个信号选项:


如果用上述方法提交了一个后台进程,那么在退出时该进程将会被终止。为了使后台进
程能够在退出后继续运行,可以使用nohup命令,下面我们就介绍这一命令。

3.4nohup命令
如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用
nohup命令。该命令可以在你退出帐户之后继续运行相应的进程。Nohup就是不挂起的意思(no
hangup)。

该命令的一般形式为:

nohupcommand
&


3.4.1使用nohup命令提交作业
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名
为nohup.out的文件中,除非另外指定了输出文件:

nohupcommand>myout.file2>&
1


在上面的例子中,输出被重定向到myout.file文件中。
让我们来看一个例子,验证一下在退出帐户后相应的作业是否能够继续运行。我们先提
交一个名为ps1的日志清除进程:


现在退出该shell,再重新登录,然后执行下面的命令:


我们看到,该脚本还在运行。如果系统不支持psx命令,使用ps-ef|grepps1命令。

3.4.2一次提交几个作业
如果希望一次提交几个命令,最好能够把它们写入到一个shell脚本文件中,并用nohup命
令来执行它。例如,下面的所有命令都用管道符号连接在一起;我们可以把这些命令存入一


30第一部分shell
下载
个文件,并使该文件可执行。


现在让它可执行:

$chmod744quarterend


我们还将该脚本的所有输出都重定向到一个名为qtr.out的文件中。


3.5小结
本章中所讨论的工具主要是有关后台运行作业的。有时我们必须要对大文件进行大量更
改,或执行一些复杂的查找,这些工作最好能够在系统负荷较低时执行。

创建一个定时清理日志文件或完成其他特殊工作的脚本,这样只要提交一次,就可以每
天晚上运行,而且无需你干预,只要看看相应的脚本日志就可以了。Cron和其他工具可以使
系统管理任务变得更轻松。

分享到:
评论

相关推荐

    LINUX与UNIX SHELL编程指南

    呵呵,这真的是一本好书《LINUX与UNIX SHELL编程指南》 --------------------------------------------- 经典《Linux与UNIX Shell编程指南》 shell是一种完整的编程语言,易学易用;shell脚本可以使烦人的手工作业...

    LINUX与UNIX SHELL编程指南(很全)

    第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 ...

    Linux与unix shell编程指南

    本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell ...

    绝版经典 LINUX与UNIX SHELL编程指南 PDF 高清版 [16.3M]

    本书共分五部分 ,详细介绍了SHELL编程技巧,各种UNIX命令及语法,还涉及了UNIX的文字处理以及少量的系统管理问题。本书内容全面,文字简洁流畅,适合SHELL编程人员学习、参考。 目录 第一部分 SHELL 第一章 文件...

    Linux与UNIX Shell编程指南.rar

    本书共分五部分 ,详细介绍了SHELL编程技巧,各种UNIX命令及语法,还涉及了UNIX的文字处理以及少量的系统管理问题。本书内容全面,文字简洁流畅,适合SHELL编程人员学习、参考。 目录 第一部分 SHELL 第一章 文件...

    Linux与UNIX Shell编程指南.

    本书共分五部分 ,详细介绍了SHELL编程技巧,各种UNIX命令及语法,还涉及了UNIX的文字处理以及少量的系统管理问题。本书内容全面,文字简洁流畅,适合SHELL编程人员学习、参考。 目录 第一部分 SHELL 第一章 文件...

    Linux与Unix Shell编程指南(PDF格式,共30章)

    本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 ...

    Linux与unix shell编程指南.rar

    第3章 后台执行命令 22 第4章 文件名置换 31 第5章 shell输入与输出 34 第6章 命令执行顺序 46 第二部分 文本过滤 第7章 正则表达式介绍 49 第8章 grep家族 56 第9章 AWK介绍 66 第10章 sed 用法介绍 89 第11章 ...

    LINUX与UNIX_Shell编程指南

    第3章 后台执行命令 第4章 文件名置换 第5章 shell输入与输出 第6章 命令执行顺序 第二部分 文本过滤 第7章 正则表达式介绍 第8章 grep家族 第9章 AWK介绍 第10章 sed 用法介绍 第11章 合并与分割 第12章 tr用法 第...

    LINUX与UNIX SHELL编程指南 高清PDF

    本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell...

    绝版经典《Linux与UNIX Shell编程指南》

    第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 ...

    linux与unix shell编程指南

    第1章文件安全与权限.PDF 第2章使用find和xargs.PDF 第3章后台执行命令.PDF 第4章文件名置换.PDF 第5章shell输入与输出.PDF 第6章命令执行顺序.PDF 第7章正则表达式介绍.PDF 第8章grep 家族.PDF 第9章AWK 介绍.PDF ...

    shell编程指南,shell脚本,本书共分五部分全。grep家族,sed,AWK,正则表达式,tr用法

    Linux与unix shell编程指南.rar 第一部分 shell 第1章 文件安全与权限 1 第2章 使用find和xargs 14 第3章 后台执行命令 22 第4章 文件名置换 31 第5章 shell输入与输出 34 第6章 命令执行顺序 46 第二部分 文本过滤...

Global site tag (gtag.js) - Google Analytics