zoukankan      html  css  js  c++  java
  • linux的作业控制(job control)

    引用:http://blog.chinaunix.net/u2/68904/showart_1803789.html

     

    把作业放到后台运行:‘ & ’

    举个简单的例子, 我们要将 /etc/ 整个备份成为 /tmp/etc.tar.gz 时,又不想要等待, 那么可以这样做:

    [xhtml] view plaincopy
    1. [root@linux ~]# tar -zpcf /tmp/etc.tar.gz /etc &  
    2. [1] 24874   <== [job number] PID  
    3. [root@linux ~]#    <== 前台可以继续作业,不受影响!  

          在该指令的最后面加上一个‘ & ’代表将该指令丢到后台中, 此时 bash 会给予这个指令一个‘工作号码(job number)’,就是那个 [1] 啦! 至于后面那个 24874 则是该指令所触发的‘ PID ’了! 我们可以继续操作 bash 了!不过,那么丢到背景中的工作什么时候完成?完成的时候会显示什么? 如果你输入几个指令后,突然出现这个资料:

    [xhtml] view plaincopy
    1. [1]+  Done              tar -zpcf /tmp/etc.tar.gz /etc  

       就代表 [1] 这个工作已经完成 (Done) ,该工作的指令则是接在后面那一串指令列。此外,这样的情况最大的好处是: 不怕被 [ctrl]-c 中断的啦!
      此外,将工作丢到背景当中要特别注意资料的流向喔!举例来说,如果我将刚刚那个指令改成:

    [xhtml] view plaincopy
    1. [root@linux ~]# tar -zpcvf /tmp/etc.tar.gz /etc &  

       情况会怎样?呵呵,在背景当中执行的指令,如果有 stdout 及 stderr 时, 他的资料依旧是输出到萤幕上面的,所以,我们会无法看到提示字元,当然也就无法完好的掌握前景工作。 所以啰,最佳的状况就是利用资料流重导向,将输出资料传送至某个档案中。举例来说,我可以这样做:

    [xhtml] view plaincopy
    1. [root@linux ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &  
    2. [1] 24984  
    3. [root@linux ~]#   

      呵呵!如此一来,资料都给他传送到 /tmp/log.txt 当中,当然就不会影响到我们前景的作业了。 这样说,您应该可以更清楚资料流重导向的重要性了吧?!^_^
      # 将‘目前’的工作丢到背景中‘暂停’:[ctrl]-z   想个情况:如果我正在使用 vi ,却发现我有个档案不知道放在哪里,需要到 bash 环境下去搜寻,此时,是否要结束 vi 呢?呵呵!当然不需要啊!只要暂时将 vi 给他丢到背景当中等待即可。 例如以下的案例:

    [xhtml] view plaincopy
    1. [root@linux ~]# vi ~/.bashrc  

      # 在 vi 的一般模式下,按下 [ctrl]-z 这两个按键 

    [xhtml] view plaincopy
    1. [1]+  Stopped                 /usr/bin/vim ~/.bashrc  
    2. [root@linux ~]#   <==顺利取得了前景的操控权!  

         在 vi 的一般模式下,按下 [ctrl] 及 z 这两个按键,萤幕上会出现 [1] ,表示这是第一个工作, 而那个 + 代表目前在背景下预设被取用的那个工作 (与 fg 这个指令有关 )! 而那个 Stopped 则代表目前这个工作的状态。在预设的情况下,使用 [ctrl]-z 丢到背景当中的工作都是‘暂停’的状态喔!   # 观察目前的背景工作状态: jobs

    [xhtml] view plaincopy
    1. [root@linux ~]# jobs [-lrs]  

      参数:   -l  :除了列出 job number 之外,同时列出 PID   -r  :仅列出正在背景 run 的工作;   -s  :仅列出正在背景当中暂停 (stop) 的工作。   范例:
      范例一:观察目前的 bash 当中,所有的工作,与对应的 PID

    [xhtml] view plaincopy
     
    1. [root@linux ~]# jobs -l  
    2. [1]+ 24988 Stopped                 /usr/bin/vim ~/.bashrc  
    3. [2]- 25006 Stopped                 /usr/bin/vim ~/.bash_history  

          如果想要知道目前有多少的工作在背景当中,就用 jobs 这个指令吧!一般来说,直接下达 jobs 即可! 不过,如果您还想要知道该 job number 的 PID 号码,可以加上 -l 这个参数啦! 在输出的资讯当中,例如上表,仔细看到那个 + - 号喔!那个 + 代表预设的取用工作。 所以说:‘目前我有两个工作在背景当中,两个工作都是暂停的, 而如果我仅输入 fg 时,那么那个 [1] 会被拿到前景当中来处理’!   # 将背景工作拿到前景来处理:fg
      刚刚提到的都是将工作丢到背景当中去执行的,那么有没有可以将背景工作拿到前景来处理的? 有啊!就是那个 fg 啦!举例来说,我们想要将上头范例当中的工作拿出来处理时:

    [xhtml] view plaincopy
    1. [root@linux ~]# fg %jobnumber  

      参数:   %jobnumber :工作的号码。注意,那个 % 是可有可无的!   范例:
      范例一:先以 jobs 观察工作,再将工作取出:

    [xhtml] view plaincopy
    1. [root@linux ~]# jobs  
    2. [1]+  Stopped                 /usr/bin/vim ~/.bashrc  
    3. [2]-  Stopped                 /usr/bin/vim ~/.bash_history  
    4. [root@linux ~]# fg      <==预设取出那个 + 的工作,亦即 [1]  
    5. [root@linux ~]# fg %2   <==直接规定取出的那个工作号码!  

         经过 fg 指令就能够将背景工作拿到前景来处理啰!
      # 让工作在背景下进行: bg   我们刚刚提到,那个 [ctrl]-z 可以将目前的工作丢到背景底下去‘暂停’, 那么如何让一个工作在背景底下‘ Run ’呢?我们可以在底下这个案例当中来测试! 注意喔!底下的测试要进行的快一点!^_^
      范例一:一执行 find / -perm +7000 后,立刻丢到背景去暂停!

    [xhtml] view plaincopy
    1. [root@linux ~]# find / -perm +7000  

      # 此时,请立刻按下 [ctrl]-z 暂停!

    [xhtml] view plaincopy
    1. [1]+  Stopped                 find / -perm +7000  
    2. [root@linux ~]#  

         范例二:让该工作在背景下进行,并且观察他!!

    [xhtml] view plaincopy
    1. [root@linux ~]# jobs ; bg %1 ; jobs  
    2. [1]+  Stopped                 find / -perm +7000  
    3. [1]+ find / -perm +7000 &  
    4. [1]+  Running                 find / -perm +7000 &  

         看到哪里有差异吗?呼呼!没错!就是那个状态列~以经由 Stopping 变成了 Running 啰! 看到差异点,嘿嘿!指令列最后方多了一个 & 的符号啰! 代表该工作被启动在背景当中了啦! ^_^
      # 管理背景当中的工作: kill
       刚刚我们可以让一个已经在背景当中的工作继续工作,也可以让该工作以 fg 拿到前景来, 那么,如果想要将该工作直接移除呢?或者是将该工作重新启动呢?呵呵! 这个时候就得需要给予该工作一个讯号 (signal) ,让他知道该怎么作才好啊! 此时, kill 这个指令就派上用场啦!

    [xhtml] view plaincopy
    1. [root@linux ~]# kill -signal %jobnumber  
    2. [root@linux ~]# kill -l  

        参数:   -l  :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?   signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:   -1 :重新读取一次参数的设定档 (类似 reload);   -2 :代表与由键盘输入 [ctrl]-c 同样的动作;   -9 :立刻强制删除一个工作;   -15:以正常的程序方式终止一项工作。与 -9 是不一样的。   范例:
      范例一:找出目前的 bash 环境下的背景工作,并将该工作删除。

    [c-sharp] view plaincopy
    1. [root@linux ~]# jobs  
    2. [1]+  Stopped                 vim bashrc  
    3. [root@linux ~]# kill -9 %1  
    4. [1]+  已砍掉                  vim bashrc  

         范例:找出目前的 bash 环境下的背景工作,并将该工作终止掉。

    [c-sharp] view plaincopy
    1. [root@linux ~]# jobs  
    2. [1]+  Stopped                 vim bashrc  
    3. [root@linux ~]# kill -SIGTERM %1  
    4. [1]+  终止                    vim bashrc  

        # -SIGTERM 与 -15 是一样的!您可以使用 kill -l 来查阅!
       特别留意一下, -9 这个 signal 通常是用在‘强制删除一个不正常的工作’时所使用的, -15 则是以正常步骤结束一项工作(15也是预设值),两者之间并不相同呦!举上面的例子来说, 我用 vi 的时候,不是会产生一个 .filename.swp 的档案吗? 那么,当使用 -15 这个 signal 时, vi 会尝试以正常的步骤来结束掉该 vi 的工作, 所以 .filename.swp 会主动的被移除,但若是使用 -9 这个 signal 时, 由于该 vi 工作会被强制移除掉,因此, .filename.swp 就会继续存在档案系统当中。 这样您应该可以稍微分辨一下了吧?
      其实, kill 的妙用是很无穷的啦!他搭配 signal 所详列的资讯 (用 man 7 signal 去查阅相关资料) 可以让您有效的管理工作与程序 (Process),此外,那个 killall 也是同样的用法! 至于常用的 signal 您至少需要瞭解 1, 9, 15 这三个 signal 的意义才好。 此外, signal 除了以数值来表示之外,也可以使用讯号名称喔! 举例来说,上面的范例二就是一个例子啦!至于 signal number 与名称的对应, 呵呵,使用 kill -l 就知道啦(L的小写)!

  • 相关阅读:
    Android开发之Sqlite的使用
    ZOJ 3607 Lazier Salesgirl
    ZOJ 3769 Diablo III
    ZOJ 2856 Happy Life
    Ural 1119 Metro
    Ural 1146 Maximum Sum
    HDU 1003 Max Sum
    HDU 1160 FatMouse's Speed
    Ural 1073 Square Country
    Ural 1260 Nudnik Photographer
  • 原文地址:https://www.cnblogs.com/mytech-blog/p/3395478.html
Copyright © 2011-2022 走看看