zoukankan      html  css  js  c++  java
  • 【转】Linux 前后台作业切换及脱机管理

    原帖:http://blog.csdn.net/robinson_0612/article/details/8889014

    Linux bash shell单一终端界面下,我们经常需要管理或同时完成多个作业,如一边执行编译,一边实现数据备份,以及执行SQL查询等其他的任务。所有的上述的这些工作我们可以在一个bash内实现,也就是说在同一个终端窗口完成。下面主要描述了Linux下前后台作业切换与管理以及作业在脱机的情形下如何管理。

    1、前后台作业的定义
       前后台作业实际上对应的也就是前后台进程,因此也就有对应的pid。在这里我们统称为作业。
       无论是前台作业还是后台作业,两者都来自当前的shell,是当前shell的子程序。
       下面是两者的定义。
       前台作业:可以由用户参与交互及控制的作业我们称之为前台作业。
       后台作业:在内存可以自运行的作业,用户无法参与交互以及使用[ctrl]+c来终止,只能通过bg或fg来调用该作业。

    2、几个常用的作业命令
       a、command &  直接让作业进入后台运行
       b、[ctrl]+z   将当前作业切换到后台
       c、jobs       查看后台作业状态
       d、fg %n      让后台运行的作业n切换到前台来
       d、bg %n      让指定的作业n在后台运行
       e、kill %n    移除指定的作业n
       "n" 为jobs命令查看到的job编号,不是进程id。
       每一个job会有一个对应的job编号,编号在当前的终端从1开始分配。
       job 编号的使用样式为[n],后面可能会跟有 "+" 号或者 "-" 号,或者什么也不跟。
       "+" 号表示最近的一个job,"-" 号表示倒数第二个被执行的Job。注,"+" 号与 "-" 号会随着作业的完成或添加而动态发生变化。
       通过jobs方式来管理作业,当前终端的作业在其他终端不可见。

    3、演示后台作业命令

    [python] view plaincopyprint?
     
    1. a、直接将作业放入到后台(附加 & 符号)  
    2. robin@SZDB:/tmp> tar -czvf temp.tar.gz tempSYBO2SZ.dbf &  
    3. [112500  
    4. robin@SZDB:/tmp> tempSYBO2SZ.dbf  
    5.   
    6. robin@SZDB:/tmp>              #此时可进行其它操作,作业一旦完成,会弹出如下的提示    
    7. [1]+  Done                    tar -czvf temp.tar.gz tempSYBO2SZ.dbf  
    8.   
    9. robin@SZDB:/tmp> ls -hltr temp*  
    10. -rwxr-xr-x 1 robin oinstall 490M 2013-05-02 17:48 tempSYBO2SZ.dbf  
    11. -rw-r--r-- 1 robin oinstall 174M 2013-05-02 17:50 temp.tar.gz  
    12.   
    13. b、已经开始执行,但需要放入后台(使用[ctrl]+z)  
    14. robin@SZDB:/tmp> tar -czvf temp2.tar.gz tempSYBO2SZ.dbf   
    15. tempSYBO2SZ.dbf  
    16.   
    17. [1]+  Stopped                 tar -czvf temp2.tar.gz tempSYBO2SZ.dbf  
    18. robin@SZDB:/tmp> jobs  
    19. [1]+  Stopped                 tar -czvf temp2.tar.gz tempSYBO2SZ.dbf  
    20.   
    21. #下面同时发布两个作业,并且在中途按下[ctrl]+z以便将当前作业提交到后台  
    22. robin@SZDB:/tmp> find /u02 -type f -size +100000k     
    23. robin@SZDB:/tmp> find / -type f -size +100000k   
    24.   
    25. #再次查看当前的jobs时,jobs管理器里出现了3个处于stopp状态的job  
    26. robin@SZDB:/tmp> jobs  
    27. [1]   Stopped                 tar -czvf temp2.tar.gz tempSYBO2SZ.dbf  
    28. [2]-  Stopped                 find / -type f -size +100000k  
    29. [3]+  Stopped                 find /u02 -type f -size +100000k  
    30.   
    31. robin@SZDB:/tmp> jobs -l    #使用-l参数查看当前shell下所有的作业以及对应的job number,进程pid  
    32. [1]  32682 Stopped                 tar -czvf temp2.tar.gz tempSYBO2SZ.dbf  
    33. [2]- 32687 Stopped                 find /u02 -type f -size +100000k  
    34. [3]+ 32707 Stopped                 find / -type f -size +100000k  
    35.   
    36. #下面通过pid可以查看到对应的进程信息  
    37. robin@SZDB:/tmp> ps -ef | grep 32707 | grep -v grep  
    38. robin    32707 32095  0 09:48 pts/1    00:00:00 find / -type f -size +100000   
    39. robin@SZDB:/tmp> tty      #当前终端的信息为pts/1  
    40. /dev/pts/1  
    41.   
    42. #打开另外一个终端  
    43. robin@SZDB:~> tty  
    44. /dev/pts/3  
    45. robin@SZDB:~> jobs                                 #此时可以看到jobs命令无任何返回  
    46. robin@SZDB:~> ps -ef | grep 32707 | grep -v grep   #仅仅根据进程id可以找到对应的作业  
    47. robin    32707 32095  0 09:48 pts/1    00:00:00 find / -type f -size +100000   
    48.   
    49. #由上可知,对于当前shell下的jobs,仅当前shell(终端)可见  
    50.   
    51. c、将后台作业切换到前台(fg命令)  
    52. robin@SZDB:/tmp> fg            #省略Job number的情形,则将缺省的job切换到前台  
    53. find / -type f -size +100000k  
    54. /u02/database/old/CNMMBOBK/undo/undotbsCNMMBOBK.dbf  
    55. ......  
    56. [ctrl]+z  
    57. robin@SZDB:/tmp> fg %1  
    58. tar -czvf temp2.tar.gz tempSYBO2SZ.dbf  
    59. robin@SZDB:/tmp> jobs  
    60. [2]-  Stopped                 find /u02 -type f -size +100000k  
    61. [3]+  Stopped                 find / -type f -size +100000k  
    62.   
    63. d、运行后台中暂停的作业(bg命令)  
    64. #前面有2个job处于stopped状态,现在我们让其在后台运行,直接输入bg命令则缺省的job继续运行,否则输入job编号,运行指定的job  
    65. robin@SZDB:/tmp> bg 2                    #输入bg 2之后,可以看到原来的命令后被追加了&  
    66. [2]- find /u02 -type f -size +100000k &   
    67. robin@SZDB:/tmp> jobs  
    68. [2]-  Running                 find /u02 -type f -size +100000k &  
    69. [3]+  Stopped                 find / -type f -size +100000k  
    70.   
    71. e、移除指定的作业n(kill)  
    72. robin@SZDB:/tmp> jobs  
    73. [3]+  Stopped                 find / -type f -size +100000k  
    74. robin@SZDB:/tmp> kill -9 %3      #强制终止job 3,注意,此处的%不可省略  
    75. robin@SZDB:/tmp> jobs  
    76. [3]+  Killed                  find / -type f -size +100000k  
    77. robin@SZDB:/tmp> jobs  
    78. #kill -9 表明强制终止指定的Job,-15则表明是正常终止指定的job。 kill -l 则列出kill能够使用的所有信号  
    79. #对于上述命令的详细帮助,使用 man command来获取帮助信息  
    80.   
    81. f、带参shell脚本的后台处理  
    82. #下面是一个测试用的shell脚本  
    83. robin@SZDB:~/dba_scripts/custom/bin> more echo_time.sh   
    84. #!/bin/bash  
    85. SID=$1  
    86. sqlplus -S scott/tiger@$1 <<EOF  
    87. select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') today from dual;  
    88. begin  
    89. dbms_lock.sleep(300);  
    90. end;  
    91. /  
    92. select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') today from dual;  
    93. exit;  
    94. EOF  
    95. exit  
    96.   
    97. #直接执行带参的shell脚本  
    98.   
    99. # Author : Robinson  
    100. # Blog   : http://blog.csdn.net/robinson_0612  
    101.   
    102. robin@SZDB:~/dba_scripts/custom/bin> ./echo_time.sh CNMMBO  
    103.   
    104. TODAY  
    105. -------------------  
    106. 2013-05-03 11:07:48  
    107.   
    108. [1]+  Stopped                 ./echo_time.sh CNMMBO   #按下[ctrl]+z将其切换到后台  
    109. robin@SZDB:~/dba_scripts/custom/bin> jobs  
    110. [1]+  Stopped                 ./echo_time.sh CNMMBO  
    111. robin@SZDB:~/dba_scripts/custom/bin> kill -9 %1       #强制终止该job     
    112.   
    113. [1]+  Stopped                 ./echo_time.sh CNMMBO  
    114. robin@SZDB:~/dba_scripts/custom/bin> jobs             #此时该job已经被标记为killed   
    115. [1]+  Killed                  ./echo_time.sh CNMMBO  
    116. robin@SZDB:~/dba_scripts/custom/bin> ./echo_time.sh CNMMBO &  #将shell脚本参数之后跟 &符号即将job放入到后台  
    117. [12233  
    118. robin@SZDB:~/dba_scripts/custom/bin>         #此时依旧可以看到有输出,但可以继续后续操作  
    119. TODAY  
    120. -------------------  
    121. 2013-05-03 11:08:25  
    122.     
    123. robin@SZDB:~/dba_scripts/custom/bin> jobs  
    124. [1]+  Running                 ./echo_time.sh CNMMBO &  
    125. robin@SZDB:~/dba_scripts/custom/bin> ./echo_time.sh CNMMBO >temp.log 2>&1 &  #最佳的办法是直接将其输出到日志文件  
    126. [22256  
    127. robin@SZDB:~/dba_scripts/custom/bin> jobs  
    128. [1]-  Running                 ./echo_time.sh CNMMBO &  
    129. [2]+  Running                 ./echo_time.sh CNMMBO >temp.log 2>&1 &  
    130.   
    131. #下面来查看日志,日志中的两次查询正好相差5分钟  
    132. robin@SZDB:~/dba_scripts/custom/bin> more temp.log  
    133.   
    134. TODAY  
    135. -------------------  
    136. 2013-05-03 11:09:24  
    137.   
    138. PL/SQL procedure successfully completed.  
    139.   
    140. TODAY  
    141. -------------------  
    142. 2013-05-03 11:14:24  

    4、作业脱机管理

    [python] view plaincopyprint?
     
      1. 将作业(进程)切换到后台可以避免由于误操作如[ctrl]+c等导致的job被异常中断的情形,而脱机管理主要是针对终端异常断开的情形。  
      2. 通常使用nohup命令来使得脱机或注销之后,Job依旧可以继续运行。也就是说nohup忽略所有挂断(SIGHUP)信号。  
      3. 如果该方式命令之后未指定&符号,则job位于前台,指定&符号,则job位于后台。  
      4.   
      5. #下面是使用nohup的示例,可以省略日志的输出,因为原job的输出会自动被nohup重定向到缺省的nohup.out日志文件  
      6. robin@SZDB:~/dba_scripts/custom/bin> nohup ./echo_time.sh CNMMBO  
      7. nohup: appending output to `nohup.out'  
      8. #直接断开终端,并重新连接一个新的终端窗口  
      9. robin@SZDB:~/dba_scripts/custom/bin> jobs     #由于是一个新的终端,所以jobs无法看到任何作业  
      10. robin@SZDB:~/dba_scripts/custom/bin> ps -ef | grep echo_time.sh  
      11. robin     2623     1  0 11:26 ?        00:00:00 /bin/bash ./echo_time.sh CNMMBO  
      12.   
      13. robin@SZDB:~/dba_scripts/custom/bin> more nohup.out   #其输出的日志可以看到job被成功完成  
      14.   
      15. TODAY  
      16. -------------------  
      17. 2013-05-03 11:26:32  
      18.   
      19. PL/SQL procedure successfully completed.  
      20.   
      21. TODAY  
      22. -------------------  
      23. 2013-05-03 11:31:32  
      24.   
      25. #下面使用nohup方式且将Job放入后台处理,同时指定了日志文件,则nohup使用指定的日志文件,而不会输出到缺省的nohup.out  
      26. robin@SZDB:~/dba_scripts/custom/bin> nohup ./echo_time.sh CNMMBO >temp2.log 2>&1 &  
      27. [13019  
      28. robin@SZDB:~/dba_scripts/custom/bin> jobs  
      29. [1]+  Running                 nohup ./echo_time.sh CNMMBO >temp2.log 2>&1 &  
  • 相关阅读:
    使用_Capistrano_进行自动化部署(2)
    使用 Capistrano 进行自动化部署
    Zend_Framework_1 框架是如何被启动的?
    PHP新版本变化
    Phpstorm 无法自动断点 Exception
    理解希尔排序
    C# Thread 线程
    Unity 依赖注入容器的AOP扩展
    C# 面向切面编程 AOP
    C# 表达式树 Expression
  • 原文地址:https://www.cnblogs.com/zhiqli/p/3270522.html
Copyright © 2011-2022 走看看