数学建模社区-数学中国
标题:
活用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 > user.data &
, r7 n) _' u2 N5 g2 y- [8 f2 Q6 a
$ {# |" P$ o! G5 I( Z$ i. \
[1] 237
3 _3 [/ o2 e4 e. @+ D( a
8 s2 N+ }2 j! c$ t- F
# find / -name core -type f -ls > core.data &
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
如上通过“&”命令将三个任务放到后台中执行。用命令“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 > 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 > core.data
& v$ o) S4 q/ c$ a) A% q
/ u! ~3 l+ g9 o2 e* D7 Y J
首先介绍一个任务控制特有的名词:当前任务。上面的当前任务是“du -a /user > 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& t
9 }" E& c( S7 T- b
命令总是有出错的时候。当出现这种情况时,用户可用Shell的内置命令“kill”来结束任务。假如想要结束后台任务“du -a /user > 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 > year2003.acct &
& 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