- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
 |
Linux作为一个多任务环境,允许用户同时执行多项任务,例如查看系统情况、备份资料、编辑文件和打印文件等。 ( x, F+ `, k/ s `7 c/ G3 F. {5 S/ a
1 ^9 S. R3 A1 v) x3 ` 对于耗时长的任务不应该让它在前台任务中执行,而应该交给后台任务去执行。这样前台任务可继续正常运作其它的操作,不用等待。示例如下: 6 x! j. J' O$ x" H5 U! q- f/ m" y
. d0 [" c* f$ {* ]( _) {/ @ # find / -name testing & 6 u: L% p: T3 E/ @' T' J
7 e- R M0 L4 z) [: h% u # fg
" }" | V, E3 s' V) s( ?6 _+ Z) v
如果想要让上面例子中的任务转为后台执行,就使用“& ”。不过,由于是后台执行的,所以该程序的输出并不会出现在屏幕上。当用户将数个任务放到后台任务执行时,要如何去管理这些后台任务?怎么知道后台任务的执行情况?如何终止或暂时停止后台任务的执行?下面就来逐一说明。
# M. c+ q/ q$ w; I' g' a" t: d) p9 ] M3 C# D/ f% o7 T6 R+ x4 K; D
<B>控制管理</B> 2 b' H! J9 T* [7 z. K
* j+ Q9 }8 t0 h7 p7 o 举例如下: ' R) V& A3 T+ {3 A q' T
; n- s+ Z o" v6 f8 {" n
# du -a /user > user.data & 3 m/ ]6 e1 u6 j
& e! F, s1 S: W7 N: A. P% x9 T
[1] 237
n2 K0 T5 N. T0 o ~
2 F7 J. V" E0 R# [* n6 K; R # find / -name core -type f -ls > core.data &
: c6 q, c: t! Y7 w7 }6 k; f+ q" j& W4 d9 Z' O7 u" `) [
[2] 238
1 V6 b" N$ O- I; i- Z5 l# p
" p# m* A( p9 u
1 `5 H R4 p" |0 s c( }- m; h c5 I% A7 R
如上通过“&”命令将三个任务放到后台中执行。用命令“jobs -l”显示后台任务的执行情况,举例如下: 0 @' K) N, X+ b+ H( t
1 S$ o, D; E2 Q5 O6 R #jobs -l 5 S. w6 H9 v* W/ ?& W
2 K5 F& A" F6 T' ^6 L9 P( P5 Q9 u! Q0 j8 b
[1] + 237 Running du -a /user > user.data
1 T# X, Y& @8 {$ ?% E
9 s* d/ C) F5 n+ B; }, ^ [2] - 238 Running find / -name core -type f -ls > core.data C/ m$ E. @1 h+ P! X3 N# g. z" r
7 F6 s3 k+ h) A6 y: x8 K
首先介绍一个任务控制特有的名词:当前任务。上面的当前任务是“du -a /user > user.data”,因为后台任务号码是“[1]”。如果当第一个后台任务顺利执行完毕,第二个后台任务还在执行中时,当前任务便会自动变成后台任务号码“[2]”的后台任务。所以可以得出一点,即当前任务是会变动的。当用户输入“fg”、“bg”和“stop”等命令时,如果不加任何引号,则所变动的均是当前任务。
- `+ g, b, Z x
5 h0 D9 a4 s- A4 s& C5 i <B>终止后台任务</B> 4 O1 P$ R2 b, F4 r/ G1 t
$ y& u' T/ q% i! V- l( K& O4 s0 W 命令总是有出错的时候。当出现这种情况时,用户可用Shell的内置命令“kill”来结束任务。假如想要结束后台任务“du -a /user > user.data”,可以用下面的命令:
$ ~' g/ X5 ]$ {& _
& G' [+ V) H9 | # kill 237 x0 d% ~' ^! p
6 R6 ]. c' N) F# {( Q) l t # kill %1
7 I9 H' M a' ?; U
9 d! s" Q8 I' e( x 其中,237为第一个后台任务的PID号码。如果想终止第二个后台任务,以下两种方法均可: P9 `$ A* a6 C
5 c4 G6 {2 N o2 t+ A y1 o8 L, r
方法一:#kill %2 + f* h$ u8 p3 `$ c+ C% }
" o8 k( \5 U# c1 `" i
方法二:# kill %- / @/ ~) ]6 F5 `
: K6 o# t9 Q' }6 ?0 c7 H6 {3 X <B>执行暂停任务</B> $ {9 A# w# E A; o- _
, {, `( D+ ]( O% \* u! _% @
Shell的内置命令“stop”可用来暂停后台任务。示例如下:
$ Q; s; W' v, E }$ O) d/ E$ i8 d2 n
stop % (停止第一个后台任务的执行)
; [7 p7 |' g Q* T1 Y# `7 k7 [" W$ h. |% U* f! O
stop %n (停止第n个后台任务的执行)
/ r5 z4 i! H: m. [ O( J0 D- z* H, \7 I$ ?& [- B4 R2 P( i
了解命令“stop”的使用后,便可将想要停止的后台任务暂停执行。例如用户要将一个年度报表用 “nroff”命令整理,因为文件量十分庞大,所以将它放到后台中执行。命令如下: 8 H; k/ U% b8 I. d, S$ M# P
4 E" }- @5 ]' J& @0 P, w _
#nroff -ms moonth[1-12].acct > year2003.acct &
- J( g/ e, h1 I) Q5 ? e! Z" [ P* T+ R/ m- A
[4] 240 & ~0 e; X# k+ l; E- ?$ E
* ?0 U( z5 C' ^, m3 ?
当命令处理到一半的时候发觉moonth12.acct文件是旧的需要更新,这时用“jobs”命令查看到后台任务“[4]”还在执行中,但无法知道命令已经处理到哪一个月份。此时可输入下面的命令,将后台任务“[4]”先暂停执行: ' R) w* C: Z. d6 d) w' h
+ w( }, u) R# z: X7 E! }( F #stop %4 7 Q$ J' l2 i( B4 J( ]3 S- Y
( n4 v, z! Q2 N$ B
然后查看文件year2003.acct的尾部判断是否已经处理到12月。如果还没有执行到,那么可以将moonth12.acct文件的资料更新,再用命令“bg”将已被暂时停止执行的后台任务“[4]”接着继续执行下去。这样不但可更正错误文件,而且不用将已处理完的任务重新再执行一次。
2 V; }0 J7 s1 Y. K/ z5 p* J8 o% n, W1 A3 }- }
<B>方便之处</B> ; K, I9 h4 c/ x# s6 \, X
6 G& v6 J$ C+ f' x. w8 o
前台、后台任务确实可以给日常操作带来方便。因为,我们在日常操作中肯定会遇到同一时间要进行多个操作。这个时候如果不使用前台任务和后台任务,那么将要花费很多时间。熟练运用前台和后台任务能达到“时”半功倍。 |
zan
|