Linux命令运行时的进程关系

我们在window环境下,打开目录,操作文件都是操作系统通过调用相关进程操作的。在Linux 环境下也是这样的情况。各种操作也是通过进程去实现的,我们去了解在 发送命令的时候,会不会生成新进程去执行,什么手生成新进程,会生成多少进程去执行是很有必要的。

因为生成进程是消耗资源的。而且进程中与进程之间的资源不共享,所以我们需要知道什么时候会生成进程。

我们常说的Linux命令,是通过shell解释工具去执行的,所以也叫shell命令 ,通常把命令放到一个文件里,去执行,也叫shell脚本。既然要说进程,且进程是通过shell解释器去调用的,所以先从shell解释器开始说。

一、shell简述

shell是一个命令行解释器工具,它是一个时刻都在运行的程序,当我们在命令行输入命令,shell会去解释执行这个命令。 shell这个工具不止一种,我们使用Linux系统的时候,默认启动的shell 是/etc/passwd 这个字段里记录的shell,下面的是bash shell.
shell 是一个工具,本质一个可执行程序
在这里插入图片描述
在这里插入图片描述

  • 上面两个图可以看出 bash shell程序位于/bin目录内。而我们去查看这个 /bin/bash文件,就可以可以看出/bin/bash(bash shell)是一个可执行程序。

二、shell的父子关系

  • 1、 上面说到,shell是一个可执行程序,既然是可执行程序,肯定是启动进程去调用的。
  • 2、用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的交互shell,即我们登录上系统时,启动的shell 是一个父shell,我们刚登陆上Linux系统的CLI界面的时候就存在了,可以用ps -f 查看

在这里插入图片描述

  • 3、如果继续在CLI提示符后输入/bin/bash 命令或其他等效的bash 命令时,会创建一个新的shell程序。这个shell程序被称为子shell (child shell)。子shell也拥有CLI提示符,同样会等待命令输入。但是表面上是看不出的
    在这里插入图片描述
    如上图可以看出,第一次什么都不做,使用ps -f 命令,就可以看到 有bash的进程,这个就是父shell, 然后我们再输入bash 命令,输入后,看不出任何变化,但实际上,已经又生成了一个子shell. 从图中可以看出,新生成的子shell的PID是537699,这个shell的父进程是 537377. 然后我们看父shell的PID就是 537377。
    在这里插入图片描述

  • 备注:进程就是正在运行的程序。bash shell是一个程序,当它运行的时候,就成为了一个进程。一个运行着的shell就是某种进程而已。因此,在说到运行一个bash shell的时候,你经常会看到“shell”和“进程”这两个词交换使用。

  • 3、连续输入3个bash,我们由上面的信息可以得知,会生成了3个子进程,通过
    ps --forest 这个命令,可以结果示的看出进程的父子关系。
    在这里插入图片描述
    在这里插入图片描述

三、在命令行中执行命令的进程调用

  • 1、我们可以在一行中指定要依次运行的一系列命令。每个命令间隔上,加上 分割号 '; ’ ,这样,所有的命令都会依次执行 。这些命令,有的会生成一个子进程去执行,有的直接在当前的shell 进程执行,这个取决于命令是内建命令,还是外建命令。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ad77a57f5fd546e8a9c37ce24ae457d3.png = 700x )
  • 2、也可以給这些命令加上一个括号,这样的话,系统会生成一个子进程,在子进程里去执行这些个命令。
    在这里插入图片描述
  • 3、要想知道是否生成了子shell,得借助一个使用了环境变量的命令。这个命令就是echo $BASH_SUBSHELL 。如果该命令返回0 ,就表明没有子shell。如果返回1 或者其他更大的数字,就表明存在子shell, 可以看出,加上括号的命令,打印的变量值就是1.

在这里插入图片描述#### 四、shell的内建命令和非内建命令

  • 1、在学习GNU bash shell期间,你可能听到过“内建命令”这个术语。搞明
    白shell的内建命令和非内建(外部)命令非常重要。内建命令和非内
    建命令的操作方式大不相同。

  • 2、外部命令

    • 外部命令,有时候也被称为文件系统命令,是存在于bash shell之外的程序。它们并不是shell程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令ps 很方便显示出它的父进程以及自己所对应的衍生子进程。因为ps是检查进程的。但是别的外部命令调用后,完成之后,这个命令就直接停止了,这个时候,再用ps -f 查看进程,也看不出来。

在这里插入图片描述

  • 3、内建命令

    • 外部命令 和内建命令的区别在于前者不需要使用子进程来执行。它们已经和shell编译成了一体,作为shell工具的组成部分存在。不需要借助外部程序文件来运行即不需要通过衍生出子进程来执行。比如cd 命令。
  • 4 、通过 type -a 可以查看出是否为内建命令,which 可以查看出外部命令的位置在哪里 ,内建命令通过which是找不到的。

  • 5、ps 就是一个外部命令。可以使用which 和type 命令找到它。ps 是 外部命令,cd 是内建命令。 分别对ps 和cd ,使用 which和type命令查询 ,可以看出区别。

在这里插入图片描述

  • 总结:内建命令和外部命令在调用的时候。外部命令会创建出一个包含全新环境的子进程,而内建命令则不会,所以外部命令的使用成本更高。内建命令因为不需要创建新环境,所以更高效,不会受到环境变化的影响
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值