Linux下的进程和作业概念,以及作业管理

进程的一个比较正式的定义是:在自身的虚拟地址空间运行的一个单独的程序。

Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。
交互进程——由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。
批处理进程——这种进程和终端没有联系,是一个进程序列。
监控进程(也称守护进程)——Linux系统启动时启动的进程,并在后台运行。


进程和作业的概念也有区别。一个正在执行的进程称为一个作业,而且作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令。例如“nroff -man ps.1|grep kill|more”这个作业就同时启动了三个进程。

作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程,等一会儿再继续执行该进程。shell将记录所有启动的进程情况,在每个进程过程中,用户可以任意地挂起进程或重新启动进程。作业控制是许多shell(包括bash和tcsh)的一个特性,使用户能在多个独立作业间进行切换。

一般而言,进程与作业控制相关联时,才被称为作业。


在大多数情况下,用户在同一时间只运行一个作业,即它们最后向shell键入的命令。但是使用作业控制,用户可以同时运行多个作业,并在需要时在这些作业间进行切换。这会有什么用途呢?例如,当用户编辑一个文本文件,并需要中止编辑做其他事情时,利用作业控制,用户可以让编辑器暂时挂起,返回shell提示符开始做其他的事情。其他事情做完以后,用户可以重新启动挂起的编辑器,返回到刚才中止的地方,就象用户从来没有离开编辑器一样。这只是一个例子,作业控制还有许多其他实际的用途。


直接将命令放到后台“执行”的&

 在bash的环境下,

 前台指:你可以控制的作业

后台指:在内存可以自行运行的作业,你无法直接控制它,除非以bg/fg等命令将该作业调用出来。

范例:

        [root@redflag ~]# tar –zpcf /tmp/etc.tar.gz /etc &

[1] 24874  <== [job number] PID

[root@redflag ~]#     <==可以继续工作,不受影响。

这里job1在后台继续工作,你可在前台继续操作linux。过了一会,会突然出现这个数据:

[1] + Done        tar –zpcf  /tmp/etc.tar.gz /etc  #这是表示[1]作业已经完成

该命令最大的好处就是不怕被“[Ctrl]+c”这个中断指令来中断了

这里就会出现一个问题,如果上面的命令是

[root@redflag ~]# tar –zpcvf /tmp/etc.tar.gz /etc &

 这时在后台执行的命令,如果有stdout和stderr时,它的数据是输出到屏幕上,所以我们无法看到提示符,也就无法完好地控制前台作业。所以,最好是使用数据流重导向,将输出数据传至某个文件中。我们可以这样做:
        [root@redflag ~]# tar –zpcvf  /tmp/etc.tar.gz  /etc > tpm/log.txt  2>&1  &
这样,数据都传送到/tmp/log.txt中,自然不会影响到前台作业。

  二、 将“当前”作业放到后台“暂停”:[crtl]+Z

如果你正在进行vi,但你想查找某个文件,需要到bash环境搜索。此时你可以暂时离开vi

    [root@redflag ~]# vi ~/.bashrc

 # 在vi 的一般模式下,按ctrl+z

[1]+  Stopped      /usr/bin/vim ~/.bashrc  #(+)表示当前在后台下默认的作业

[root@redflag ~]#   <== 获取了前台的控制权

三、 观察当前后台作业状态:jobs

  [root@redflag ~]# jobs [-lrs]

  参数:

   -l:除了列出作业号之外,同时列出PID

   -r:仅列出正在后台运行的作业

   -s:仅列出正在后台暂停的作业

  范例:

    [rot@redflag ~]# jobs –l

  [1]+ 24988 Stopped     /usr/bin/vim ~/.bashrc

  [2]- 25006 Stopped     /usr/bin/vim ~/.bash_history

   一般来说,直接执行jobs即可。在上面的输出中,有(+ -)号。(+)表示默认的作业。所以说“当前我有两个作业在后台,两个作业都是暂停的,如果我仅输入fg时,那么[1]会被拿到前台处理”

  四、 将后台作业拿到前台处理,fg

   [root@redflag ~]# fg %jobnumber

   范例:

      [root@redflag ~]# jobs

    [1]+ 24988 Stopped     /usr/bin/vim ~/.bashrc

    [2]- 25006 Stopped     /usr/bin/vim ~/.bash_history

   [root@redflag ~]# fg   <==默认取出+的作业,即[1]

   [root@redflag ~]# fg %2 <==直接规定取出的作业号码

  五、 作业在后台运行:bg

   之前都是将作业放到后台去“暂停”,而bg实现一个作业在后台运行。

     [root@redflag ~]# find / -perm +7000

    #此时,请立刻按ctrl+z暂停

    [1]+ stopped       find / -perm +7000

   [root@redflag ~]# 

   [root@redflag ~]# jobs ; bg %1 ; jobs

    [1]+ Stopped         find / -perm + 7000

    [1]+ find / -perm +7000 &

    [1]+ Running         find / -perm +7000 &

    此时Stopped变成了Running,命令行的最后多了一个&符号,表示该作业在后台启动了。

注意:1-5操作过程中“%jobnumber”可以将“%”省略直接加jobnumber即可。

六、 管理后台作业:kill

   [root@redflag ~]# kill –signal %jobnumber

   [root@redflag ~]# kill –l

    参数:

    -l:列出当前kill能够使用的信号(注意是小写L)

    -1:重新读取一次参数的设置文件(类似reload)   ---对应的信号为SIGHUP

     -2:表示与由键盘输入ctrl+c同样的动作         ---对应的信号为SIGINT

     -9:立刻强制删除一个作业                    ---对应的信号为SIGKILL

     -15:以正常方式终止一项作业                 ---对应的信号为SIGTERM 

      [root@redflag ~]# jobs

    [1]+ Stopped         vim bashrc

   [root@redflag ~]# kill -9 %1             #以强制方式删除

   [1]+ 已删除          vim bashrc     

   [root@redflag ~]# kill –SIGTERM %1      #-SIGTERM与15是一样的

   说明一下以正常方式与强制方式来终止作业的区别:例如,用vi编辑文件的时候会产生一个.filename.swp文件,如果以正常方式来结束作业,那么.filename.swp文件会主动被删除;相反以强制的方式来结束作业,那么.filename.swp文件会继续存在文件系统中。

   注意:kill可以帮我们将信号传送给某个作业(%jobnumber)或者是某个PID(直接输入数字),也就是说,kill后面直接加数字与加上%的情况是不同的。


你可能感兴趣的:(LINUX)