数学建模社区-数学中国

标题: 活用Linux操作系统的后台任务 [打印本页]

作者: 韩冰    时间: 2004-11-21 10:35
标题: 活用Linux操作系统的后台任务
Linux作为一个多任务环境,允许用户同时执行多项任务,例如查看系统情况、备份资料、编辑文件和打印文件等。
) A" R# d( ]; u: w8 |: ]0 g2 @# v& }9 G( r/ S- O' O# S
  对于耗时长的任务不应该让它在前台任务中执行,而应该交给后台任务去执行。这样前台任务可继续正常运作其它的操作,不用等待。示例如下: 4 s6 i, S. M3 [
# W, l2 t% g7 F2 z# ^0 _
  # find / -name testing & 2 b! `+ s: K9 @* |) e4 C0 W2 F2 D

2 d$ S& v% I7 E# x. _  # fg ! X: f" m+ ~" ~  H8 W
& x) p, k7 F4 X2 `( X
  如果想要让上面例子中的任务转为后台执行,就使用“& ”。不过,由于是后台执行的,所以该程序的输出并不会出现在屏幕上。当用户将数个任务放到后台任务执行时,要如何去管理这些后台任务?怎么知道后台任务的执行情况?如何终止或暂时停止后台任务的执行?下面就来逐一说明。
! w$ {! T7 e7 q* A5 Z, G7 X" c1 b) b& w" [$ S% Y. c8 h
  <B>控制管理</B> - i$ e5 I  f* s- `
7 q8 ]1 e+ T" L+ m& y
  举例如下: ' z- [. s# U+ R- D1 t

8 T* o7 q- [* b% M3 Q  # du -a /user &gt; user.data &amp; , r7 n) _' u2 N5 g2 y- [8 f2 Q6 a
$ {# |" P$ o! G5 I( Z$ i. \
  [1] 237
3 _3 [/ o2 e4 e. @+ D( a8 s2 N+ }2 j! c$ t- F
  # find / -name core -type f -ls &gt; core.data &amp;
7 z% v- W8 o3 r- D. i# A2 n( s; t! T0 g6 F$ T$ D
  [2] 238 " c0 `( _5 a  T# M/ d- a* g  X* Y- ?

5 z5 H5 l9 P6 V& y* Q3 H  
6 r* m& P) N# Z4 m' b* ?, C; X+ H4 f) j+ U6 P
  如上通过“&amp;”命令将三个任务放到后台中执行。用命令“jobs -l”显示后台任务的执行情况,举例如下: 4 d- r& D) v! H" `

8 Z. d, H, D+ G. K) \4 H  #jobs -l / r( p% |. a/ ]. ?

& D0 H6 T: ?& R  [1] + 237 Running du -a /user &gt; user.data + J7 D0 k& p+ u
6 n2 y: q  j! M8 [$ Q& [5 d9 x
  [2] - 238 Running find / -name core -type f -ls &gt; core.data  
& v$ o) S4 q/ c$ a) A% q/ u! ~3 l+ g9 o2 e* D7 Y  J
  首先介绍一个任务控制特有的名词:当前任务。上面的当前任务是“du -a /user &gt; user.data”,因为后台任务号码是“[1]”。如果当第一个后台任务顺利执行完毕,第二个后台任务还在执行中时,当前任务便会自动变成后台任务号码“[2]”的后台任务。所以可以得出一点,即当前任务是会变动的。当用户输入“fg”、“bg”和“stop”等命令时,如果不加任何引号,则所变动的均是当前任务。
+ `+ w1 Q2 h2 O7 p4 R/ `+ X; n9 Z2 X1 B& n4 `
  <B>终止后台任务</B>
- }) }2 `9 l, M9 n& t9 }" E& c( S7 T- b
  命令总是有出错的时候。当出现这种情况时,用户可用Shell的内置命令“kill”来结束任务。假如想要结束后台任务“du -a /user &gt; user.data”,可以用下面的命令:
8 _2 l) B, Q2 G) B' U0 @3 ]% t. I! m6 H9 K/ z
  # kill 237 1 W5 L6 k% C- c8 n* ]

0 Y7 n5 S3 ?: s8 p% M  # kill %1
" q2 n$ a2 c$ i! L7 b8 E5 W
1 ~# v* v4 |0 E& X! l  其中,237为第一个后台任务的PID号码。如果想终止第二个后台任务,以下两种方法均可: % q8 m* I( w1 N- u" E

* p* ?) G& }6 a% I: h6 H  方法一:#kill %2 3 ^9 n, D& p8 h, b, x

6 \% S) t( \, O/ b2 r  方法二:# kill %- % I3 ?8 i, \! h+ I0 u( f% `# f& g* t* }, B
* W* \; w5 W/ e0 J9 p
  <B>执行暂停任务</B> 8 A: `3 G9 j7 B+ r

/ Z5 c) Z8 e8 I6 D  Shell的内置命令“stop”可用来暂停后台任务。示例如下: ! |* k! A- v2 J3 W4 M/ `7 h( p
; }$ F  d/ B0 Q  L: Y2 @( C
  stop % (停止第一个后台任务的执行) + }! I: Y8 p# A. V' f6 R
0 ^/ J/ z4 H8 V
  stop %n (停止第n个后台任务的执行) 9 {9 M7 f/ W" B: s0 E

, r1 M% n2 m3 q! u7 v  了解命令“stop”的使用后,便可将想要停止的后台任务暂停执行。例如用户要将一个年度报表用 “nroff”命令整理,因为文件量十分庞大,所以将它放到后台中执行。命令如下:
5 ^# L: Z- A$ ~
" i4 V% o0 g: r/ {1 U6 W/ D4 d  #nroff -ms moonth[1-12].acct &gt; year2003.acct &amp; & o& f$ q( ~, B) p

9 P7 _; k7 b3 ?/ K  [4] 240
/ g' E0 f2 A$ y! E* f( S
2 X6 ]4 `  a+ j6 ^; _+ `  当命令处理到一半的时候发觉moonth12.acct文件是旧的需要更新,这时用“jobs”命令查看到后台任务“[4]”还在执行中,但无法知道命令已经处理到哪一个月份。此时可输入下面的命令,将后台任务“[4]”先暂停执行: 5 A( e5 R3 H. B. N4 Q

5 \! a! _  E- Y+ [  #stop %4 + M6 l7 x2 V% h9 k' `

# d% w. G, g, d, v5 g- E/ d  然后查看文件year2003.acct的尾部判断是否已经处理到12月。如果还没有执行到,那么可以将moonth12.acct文件的资料更新,再用命令“bg”将已被暂时停止执行的后台任务“[4]”接着继续执行下去。这样不但可更正错误文件,而且不用将已处理完的任务重新再执行一次。
, I9 F& ]0 X' `6 x( D3 g8 m% s- d) O' Y
  <B>方便之处</B>
& a3 s% g) _" s! b& R
' K% A# {! Q: Z  前台、后台任务确实可以给日常操作带来方便。因为,我们在日常操作中肯定会遇到同一时间要进行多个操作。这个时候如果不使用前台任务和后台任务,那么将要花费很多时间。熟练运用前台和后台任务能达到“时”半功倍。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5