• Linux编程 9 (shell类型,shell父子关系,子shell用法)


    一. shell类型

      1.1  交互式 bin/ shell程序

        当用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器时,默认的shell程序就会开始运行。系统启动什么样的shell程序取决于你个人的用户ID配置,在etc/passwd文件中。如下图所示,root用户使用bash shell作为自己的默认shell程序。
          
        bash shell程序位于/bin目录下,使用长列表可以看出它是一个可执行程序:
          
        像/bin/tcsh 或/bin/dash 或/bin/csh 这些都是shell程序。在我centos 7中没有找到,由于bash shell 使用者最多,很少有人使用其它shell作为默认shell。

      1.2  系统 bin/sh程序

        除了bash/shell程序还有另外一个默认的shell是/bin/sh。它作为默认的系统shell,用于那些需要在启动时使用的系统shell脚本。在centos 系统中可以看到,使用软链接将默认的系统shell设置成bash shell。这样说来,sh其实就是bash程序。
          
        但注意的是有些发行版系统上,默认的系统shell和默认的交互shell并不相同。例如在Ubuntu发行版中。最后并不是必须一直使用默认的交互shell,可以使用发行版中所有可用的shell。可以直接输入命令/bin/dash来启动dash shell。具体就不在演示。


    二. shell的父子关系 

       2.1 创建子shell 

        上面说的默认bash shell, 是一个父shell。之前所有章节中所用的交互式shell 都是用的父shell。要创建一个子shell程序很简单,输入bash就会创建一个新的shell程序,被称为子shell。要区分是父shell还是子shell,需要使用前面所学的ps 查看进程命令。
        在root用户下,先看没有子shell的父shell进程,如下图所示:
          
        接下来,输入bash,来创建一个子shell, 该子shell的PPID父进程是1748, 对应-bash进程的(PID) 1748。
          

      2.2 子shell创建shell

        上面创建的子shell进程为4136。子shell也可以创建一个子shell,子shell再创建子shell。它们的关系如下图所示:
          
              

        下面来演示下这个关系图的shell创建和它们之前的关系层次。下图中又创建了二个子shell,总共三个子shell。依次是子shell, 孙shell, 曾孙shell。
          

        下图使用ps -f命令也能够通过PPID列出谁是谁的父进程。
          

        注意:生成子shell的成本不低,而且速度还慢,创建嵌套的子shell去处理命令进程性能更为严重。

      2.3 退出子shell

        通过输入exit命令能有条不絮的退出子shell,例如上面的三个子shell, 首先从曾孙shell退出, 如下图所示:
          

        当没有了子shell时,再输入exit将退出控制台终端。

    三. 其它子shell的用法     

      3.1 进程列表子shell

        在shell中,将命令放入括号中,并在命令列表尾部加分号(;)。这样便会创建出一个子线程去执行。是否生成了子shell,需要借助echo $BASH_SUBSHELL,如果该命令返回0,表示没有子shell。 如下图所示:一组命令放入括号中,产生了一个子shell去执行的。
          

        上面说了用命令列表放入括号中,就会创建一个子shell,下面在括号中再套一个括号, 结果是在子shell上创建了子shell。
          

        在shell脚本中,经常会使用子shell进行多进程处理。但采用子shell明显拖慢处理速度。因为它并非真正的多进程处理,因为终端控制着子shell的I/O。

      3.2 后台模式子shell

        在交互式shell中,一个高效的子shell用法就是使用后台模式,在后台模式中运行命令在处理命令的同时让出CLI,以供他用。 演示后台模式经典命令就是sleep。想要将命令置入后台模式。在命令末尾加上字符&。 结合sleep暂停10秒,通过ps命令来看看。
        如下图所示,将sleep命令置入后台模式,在shell CLI提示符([root@hsr ~]#)返回之前,出现了后台作业号1,以及后台作业进程1317。通过ps可以看到,该后台命令进程1317一直在运行。
          

        通过jobs命令可以查看当前后台模式的进程信息(另外jobs -l 显示进程号),如下图所示:
          
        一但10秒过后,后台进程完成,再输入命令jobs,可以看到该命令进程已完成,如下图所示:
          
      
      3.3 后台模式 进程列表子shell

        在3.1中讲到了进程列表子shell, 进程列表是运行在子shell中的一条或多条命令。下面将进程列表置入后台模式,如下所示:当一级子shell的数字1显示在提示符的旁边时,按下回车键。
        

         在使用shell时,很多情况下,可以将命令置入后台模式,例如在前面章节讲到的tar归档,下面演示创建备份文件,有效利用后台模式,下面将mysql的慢日志归档。
        
        

        将子shell要处理的进程置入后台模式,即可以在子shell中进行繁重的处理工作,又不会让子shell的I/O受制于终端。

  • 相关阅读:
    asp.net textbox控件readonly为true时,后台取值的问题
    未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73”或它的某一个依赖项
    DataSet与DataReader的比较
    EntityFramwork所有 SSDL 项目都必须以同一提供程序为目标。ProviderManifestToken“2008”不同于以前遇到的“2005”
    路由器wan口连接不上的问题
    Git学习(四)----版本号跳转
    jquery记分牌的插件
    ORACLE 第4节 多表查询
    基于消息机制的异步架构之回调函数注冊
    干货!手把手教你怎样高速了解一个行业--游戏产业概况
  • 原文地址:https://www.cnblogs.com/MrHSR/p/9639279.html
Copyright © 2020-2023  润新知