搜索

RSS

RSS Link

Linux下的Job Control

2010年11月05日 06:20 | Comments(2) | Category:Linux | Tags:

 

 

最近开始认真的学习Linux,在看一本基础的Linux教程,其中在书中提到了一些关于Linux中Job控制的知识,由于书籍中讲解的比较凌乱,因此自己整理出来,以防便以后查阅。同时也强制自己开始写一些Blog,让自己慢慢的摆脱拖沓的习惯,开始一些积累。

本文章将介绍下面一些内容:

  • Job的概念
  • Linux下Job Control的一些知识
  • Linux下关于Ctrl-C、Ctrl-Z、Ctrl-D的具体意义
  • 参考资料

 

一.Job的概念

初始Job,记得是在上李彤老师的软件工程的课程中接触的,具体的含义现在早已经不记得了。身边又没有软件工程的书籍可以查阅,因此对于Job的概念自己已经说不清楚了,只能凭借残存在脑海中一些零星片段加上Wiki上面的解释,大概描述了。

Job是指在批处理的环境中,为完成某一任务而进行一系列操作的总称。在个人接触计算机的年代,批处理的环境已经不容见到了,只有一些特殊的行业和环境下还在使用这样的概念,仅在书本中接触过。

在Linux下,可以简单的把Job理解为,一个或多个通过Pipe链接的命令及其运行所完成的任务。

例如,我需要把当前的登录的用户信息,记录到名字为LoginUser的文件中,那么我可能回执行下面命令来完成:

lennon@lennon-laptop:~$ who > LoginUser

那们就可以把从命令的执行到LoginUser文件输出的整个过程成为一个Job。

 

二.Linux下面Job Control的一些知识(包括jobs、bg、fg、kill命令的使用)

1.通过使用‘&’操作符让Job在后台运行

通常我们Linux在终端中,运行某一命令时,终端总是等待某一特定的命令或程序运行完以后,给出一个提示,然后我们才能继续运行下一个命令。如果我们要运行一个比较耗时的命令,但是在该命令运行的同时还需要做另外的一些事,那该怎么办呢?

你可以通过在命令的后面加上一个‘&’操作符,来让一个任务在后台运行。(当然如果你是用GUI界面,你也可以重新打开一个窗口运行新的命令或程序)

例如,我们需要拷贝一个比较大的文件,在拷贝的同时,还要做其他一些事情,那么在拷贝命令后面加上一个‘&’,让它在后台拷贝:

lennon@lennon-laptop:~$ cp /media/bigfile /home/lennon/Downloads/ &
[1] 3526
lennon@lennon-laptop:~$ 

此时,我们可以看到在终端中,执行了某一命令后,给出了一些信息,然后就返回了,接着提示用户可以出入下一个命令了,这样程序或命令就在后台执行了。

在显示的信息中,用方括号括起来的数字,表示系统分配给这个Job的Job Number,这里'[1]'中的1,就是这个Job的Job Number。而后面一个比较大的数字,则是系统分配的进程ID(PID),这个PID在系统就代表这个进程。

在后台运行的job,当其运行完成以后,会在终端中给出一个提示:

lennon@lennon-laptop:~$ rm Downloads/linux_11gR2_database_1of2.zip &
[1] 3666
lennon@lennon-laptop:~$ 
[1]+  Done                    rm Downloads/linux_11gR2_database_1of2.zip

这里,不知到是什么原因,我的机子上,只有当在此输入回车后,这个提示才会显示。

 

2.使用jobs命令,来查看当前系统中的Job

如果我们需要查看当前系统中,有那些job,使用‘jobs’命令:

lennon@lennon-laptop:~$ jobs
[1]-  Running                 cp /media/bigfile /home/lennon/Downloads/ &
[2]+  Stopped                 cat
lennon@lennon-laptop:~$ 

如此时,显示我的系统中有2个job,一个是刚才的正在运行的拷贝命令([1]标识),一个是停止运行的cat命令([2]表示)。这里‘Running’、‘Stopped’表示任务的状态。

jobs命令参考

命令名称:jobs
使用权限:所有权限
命令描述:列出系统中的job。注意:不是所有的shell都能使用次命令
语法:jobs [-p | -l] [-n] [-p] [-x] [job id]
参数:
-p | -l : Report the process group ID and working directory of the jobs.
-n      : Display only jobs that have stopped or exited since last notified.
-p      : Displays only the process IDs for the process group leaders of the selected jobs.
-x      : Replace any job_id found in command or arguments with the corresponding 
           process group ID, and then execute command passing it arguments.
job id  : The job id.

 

 

3.Suspend key 和 bg命令的使用(将一个正在运行的job放到后台运行)

如果你在运行job前,并不知道该job的运行情况,但在job运行了以后,发现这个是耗时的任务,并想将其放入到后台运行,这样你可以在这个任务运行的同时,完成一些其他的事情,那么你可以这样做:

使用挂起键(Suspend Key,通常是Ctrl-Z)将该任务挂起(也就是暂停),然后使用‘bg’命令在后台让该job恢复执行。

lennon@lennon-laptop:~$ cp bigfile bigfile.bac
^Z
[1]+  Stopped                 cp bigfile bigfile.bac
lennon@lennon-laptop:~$ bg %1
[1]+ cp bigfile bigfile.bac &
lennon@lennon-laptop:~$

使用Ctrl-Z后,系统会将当前正在运行的job暂停,将其移至后台,给出用户改任务的提示(包括job number、状态、job),然后提示用户输入下一个命令。

在job挂起后,可以使用‘bg’命令,让job恢复到刚才中断的地方继续运行并将其放到后台运行。使用‘bg %job number’来指定你需要对哪一个job进行操作,这里‘%’告诉系统后面的数字是一个job number(不要‘%’可能也可以)。当然在系统中只有一个job的时候,你也可以忽略改参数。

bg命令参考:

命令名称:bg
使用权限:所有权限
命令描述:在后台恢复已停止的job继续运行。注意该命令不能在所有的Unix的shell下运行
语法:bg [-l] [-p] [-x] [job]
参数:
-l    : Report the process group ID and working directory of the jobs.
-p    : Report only the process group ID of the jobs.
-x    : Replace any job_id found in command or arguments with the corresponding process  
         group ID, and then execute command passing it arguments.
job   : Specifies the job that you want to run in the background.

 

4.使用fg命令,将在后台的job换到前台

当你需要将在后台的job换到前台时,使用‘fg %job number’命令(也许不要‘%’也可以)。

lennon@lennon-laptop:~$ cp bigfile bigfile.bac &
[1] 3815
lennon@lennon-laptop:~$ fg 1
cp bigfile bigfile.bac

fg命令参考:

命令名称:fg
使用权限:所有权限
命令描述:将后台的任务移至前台,如果是该任务处于暂停状态,则恢复该任务的运行。
         注意该命令不是在所有的shell中都能运行。
语法:fg [%job]
参数:
%job : Specifies the job that you want to run in the foreground.

 

5.如何结束一个job

如果你想结束一个正在运行的job,可以使用中断键(interrupt key,通常是Ctrl-C)来结束。

lennon@lennon-laptop:~$ cp bigfile bigfile.bac 
^C
lennon@lennon-laptop:~$ 

如果上面方法无法正常工作,那么你可以考虑使用Ctrl-Z(Suspend key)来暂停job,使用'jobs'命令来查看这个job的job number,然后通过'kill'命令来结束这个job.

lennon@lennon-laptop:~$ cp bigfile bigfile.bac 
^Z
[1]+  Stopped                 cp bigfile bigfile.bac
lennon@lennon-laptop:~$ jobs
[1]+  Stopped                 cp bigfile bigfile.bac
lennon@lennon-laptop:~$ kill %1
lennon@lennon-laptop:~$ 
[1]+  Terminated              cp bigfile bigfile.bac

'kill %1'中的'%'告诉系统,后面的数字是一个job number。默认情况下,kill将会向程序发送一个termination signal(-TERM)。如果这个信号不起作用,考虑使用'kill -kill %job number'来发送一个kill signal(-KILL)。

'kill'命令的使用,就看man把,info也可以,这里不说了,上面东西太多。不过常用的也就'kill %job number'、'kill -kill %job number'、'kill [-kill] PID'。

 

三.Linux下Ctrl-Z、Ctrl-C、Ctrl-D的具体含义

初识Linux,可能会对Ctrl-Z、Ctrl-C、Ctrl-D的具体含义混淆不清,因为这三个按键都能够在一些情况下使shell退出正在执行的命令或程序,提示用户输入下一个命令,从而对初识者造成假象,认为三个键的功能一样,但具体情况下哪个按键能起作用、起什么作用却拿捏不定。

  • Ctrl-Z:该键是linux下面默认的挂起键(Suspend Key),当键入Ctrl-Z时,系统会将正在运行的程序挂起,然后放到后台,同时给出用户相关的job信息。此时,程序并没有真正的停止,用户可以通过使用fg、bg命令将job恢复到暂停前的上下文环境,并继续执行。
  • Ctrl-C:该键是linux下面默认的中断键(Interrupt Key),当键入Ctrl-C时,系统会发送一个中断信号给正在运行的程序和shell。具体的响应结果会根据程序的不同而不同。一些程序在收到这个信号后,会立即结束并推出程序,一些程序可能会忽略这个中断信号,还有一些程序在接受到这个信号后,会采取一些其他的动作(Action)。当shell接受到这个中断信号的时候,它会返回到提示界面,并等待下一个命令。
  • Ctrl-D:该键是Linux下面标准输入输出的EOF。在使用标准输入输出的设备中,遇到该符号,会认为读到了文件的末尾,因此结束输入或输出。

 

四.参考文献

uuencode工具的使用

2010年11月05日 04:50 | Comments(0) | Category:Linux | Tags:

今天在看一本linux的书籍,其中一个章节的练习中提到了uuencode这个工具,初始不懂,查看man帮助之后,依然不知到如何使用,后面google之,终于明白了,记录之,以防日后忘记,又做重复工作。

下面之介绍简单的uuencode工具的使用。

其实uuencode与uudecode是一套工具,都包含在GNU sharutils package中。其中uuencode用于将二进制文件编码成为ACSII,而uudecode用于将使用uuencode编码的文件还原为原来的二进制文件。

在man中,这样描述uuencode、uudecode的使用语法:

uuencode [-m] [ file ] name
uudecode [-o outfile] [ file ]...

在uuencode中,file指明需要编码的文件,如果不指明,则系统以标准输入设备输入,而name用于指明在uuencode编码后的输出数据,使用uudecode还原后,还原的文件名称。这里需要指出的是,uuencode的输出都是直接输出到标准的输出设备,例如:

lennon@lennon-laptop:~/Documents/LearnLinux$ uuencode colors.2.gz test_uuencode
begin 644 test_uuencode
M'XL("`P;Q$P``V-O;&]R<RXR`"M*3>%*RBE-Y4HO2DW-XZI,S<G)+^?*+TK,
-2T_E`@!NZQGI'0```````
end

uuencode输出数据,都是以beging开头,以end结尾的。第一行中,记录编码的信息

  • begin后面的644是unix档案调用的权限代码
  • 而test_uuencode,指明使用uudecode还原该数据后的文件名
  • 后面的字符,就是编码后的结果

如果执行下面命令:

lennon@lennon-laptop:~/Documents/LearnLinux$ uuencode colors.2.gz test_uuencode > uuencode_result

那么将会把编码后的信息存入uuencode_result文件中(由于uuencode的输出是标准输出,所以我们使用重定向命令,将其重定向到uuencode_result中),接着使用解码工具解码:

lennon@lennon-laptop:~/Documents/LearnLinux$ uudecode uuencode_result

将会把uuencode_result文件解码,并且将解码后的结果存放到test_uuencode文件中。

好了,基本的使用就介绍到这里。man中不容易理解的地方就是name参数的意义,其实实在使用uudecode的时候,这个参数的作用才能知道。uuencode、uudecode是成对使用的。理解这个后,其他详细的信息,就参阅man帮助文档吧

参考资料:

 

来源:http://www.isstudy.com/linux/731.html

命令名称:uuencode

使用权限:所有使用者

使用方式:

uuencode [-hv] [sourcefile] targetfile

说明:
早期在许多 unix 系统的传送协定只能传送七位元字元,并不支援二进位档案,像中文文字档就有用到八位元,所以无法完整地送到另一架机器上。 uuencode 指令,可以将二进位档转换成七位元的档案,传送到另一架机器上再以 uudecode 还原。最常见的是用在以电子邮件传送二进位档。uuencode 编码后的资料都以 begin 开始,以 end 作为结束。
begin 644 decode.dat  
(内容编码)  
`  
end
begin 后的 644 是 unix 档案的调用权限代码。而 decode.dat 则是还原后的档名。
参数:  
h 列出指令使用格式 (help)  
v 列出版本讯息 (version)
范例:
将 source.dat 编码后存成 file.uud 档。由于 uuencode 会将编码后的资料在荧幕上列出,所以必须将资料导入 file.uud 中,而 target.dat 是 file.uud 还原后的档案名字,而不是编码后的档案。

uuencode [-hv] [sourcefile] targetfile

执行指令后,由标准输入装置读入资料,简单地说是由键盘输入后在荧幕显示的资料,按 Crtl d 键后就会被编码,输出至 file.uud 中。由于程序是以行为处理单位,若无法跳出程序,请多按几次 Ctrl d 直到程序结束为止。 安全技术

uuencode target.dat > file.uud

类似上一个指令,不过使用一个导入的技巧,将 source.dat 压缩后的资料传送给 uuencode 处理之后,存成 file.uud 档。 file.uud 档还原后就是 source.dat.Z 档。

compress -c source.dat | uuencode source.dat.Z > file.uud

显示版本讯息后,结束执行程序。

uuencode -v