在shell中的多进程实现主要是一个什么

描述

主要是介绍两个部分,

Linux系统

shell编程的话它主要是有这样三个特点, 第一个就是简单高效, 第二个是功能强大, 第三个是可移植好。

因为他把我们的Linux的命令都放到shell编程里面,然后再通过加上循环加上判断,然后实现这样一个脚本, 这样子的话我们就能够去实现各种各样想要的一些功能。

作为运维人员的话,我们编写需要脚本是我们实现自动化的一个开始, 首先shell编程的话会有一个误区,

Linux系统

我们最开始早期接触shell编程的话,‍‍我们觉得我们会把那些Linux命令直接就放到脚本里面,‍‍它这样的话我们最开始的就会认为shell编程 其实就是跟 Linux 命令堆在一起,‍‍但是我们从shell编程的一个简单的角度上考虑的话,它其实是Linux命令,还有再加上一些编程语法,‍‍ 比如说我们给 Linux 命令加上一个什么 if 判断,‍‍如果说命令执行成功,我们才去执行下一个,或者说我们才输出一个信息,‍‍就是这样的一个命令,再加上一些语法之后,就形成了这样的一个shell脚本。‍‍

下面这三个就是我们的经验之谈, 首先第一个就是运维的核心,就是在正确的节点上面去正确的去执行这些正确的Linux命令。‍‍比如说我们要启动某一台节点上的某个服务,‍‍对吧?我们要登录到远程登录到这个节点上面,然后去执行把服务起来的一个动作,‍‍或者说我们要执行把这个服务重新加载的一个动作,‍‍然后运维工具的本质是什么?就是能够远程登录到这台节点上面去执行 Linux 命令,‍‍这个是很多运维工具的一个基本功能。‍‍

比如说我们后面用到的ansible和saltstack,它们都会有这样的一个最基础的功能,‍‍这个也是我们作为使用者会经常使用的功能。‍‍

然后运维开发是什么?就是说我们要把我们这些经常要登录到某台节点,‍‍然后去做的某些采集数据的动作,或者说发邮件通知,如果说有节点异常,我们要报警,‍‍我们会把这些动作,我们以前要手工操作的这些步骤,全部用写成代码,写成脚本,‍‍我们通过 Python运行一下脚本,或者说写成shell或者说写成放到定时任务里面去定时执行,‍‍这样的话我们就实现了自动化的开发。‍‍

我们运维开发主要是将我们这些手动的操作去写成代码,然后放到代码,然后有代码去帮我们执行,‍‍去实现操作的自动化,至少我们要能够实现就节约我们这些运维人员的时间。‍‍

好,关于shell编程中的一些重要概念,其实跟大部分的编程语言是一样的,‍‍所以我们要看到shell编程中也有变量的,

Linux系统

变量定义,还有字符串的一些操作,还有数组还有判断计算,‍‍计算的话就是简单的加减乘除,然后还有浮点运算等等,还有在需要shell里面也会有函数的概念。‍‍

此外的话shell的函数和我们其他高级语言的函数,比如说Python或者说C,C++这些函数它是不一样的,‍‍它的传参是比较特别的,我们是通过位置参数去传。‍‍

接下来的话我们会在shell编程的实战中看到这一点,然后参数的话它其实会分什么?函数的参数‍‍和脚本的参数都统一称之为位置参数。‍‍

接着的话还有循环,我们最核心的就是要实现叫多进程的操作。‍‍好,在shell中判断条件,还有循环语句,这些都是最基本的判断语句,最基本的就是if。

Linux系统

循环的话主要就是for while和until这三个语句。‍‍

在shell中的多进程,实现主要是一个什么?

Linux系统

要实现这样一个后台执行服务,‍‍我们一个操作或者说我们调用一个函数,我们在操作后面加上& 的符或者说与符的时候,‍‍这个操作或者说这个函数它里面的任务就会放到后台去,自动去起一个进程去执行,但是它会存在一个问题,‍‍假设我有100个这样的操作,我每一个操作都加上& ,‍‍这样的话后台就会起100个进程分别去执行这些动作,这样的话我们是没有办法去控制进程数的。‍‍

如果说假设我们的任务有1万个,‍‍我们真的能够在一台节点上面去1万个进程去执行这些操作吗?‍‍这样子的话效率其实是会急剧下降的,因为进程之间的一个开销其实也是非常大的一个开销,‍‍它也会占用大量的时间,甚至会导致这个节点无法执行。

我们需要去控制每次启动的进程数,‍‍控制进程数的一个核心就是通过这个叫文件描述符和管道配合执行,‍‍它是怎么样执行,我这里就画了这样一个图。‍‍

Linux系统

我们首先看一下这个管道,管道的一个特点就是说我这边管道里面假设有10个数据,‍‍我如果说想从管道里面读取一个数据的时候,这个时候管道里面是不是减少了一个‍‍,假设我这个管道里面没有数据,我读的时候我这个操作想从管道里面去读一个操作,‍‍这个时候这个操作其实会阻塞在这里,它就不会返回,它就会一直阻塞到这里,直到什么时候返回,直到我从有另外一个操作像管道里面去写入一个字符串的时候,‍‍这边阻塞的操作就能够立马收到这个字符串,然后它这个操作就会返回,‍‍

这样子我们怎么样实现控制最大进程数,那就很简单,比如说我们管道里面有三个字符,本身有三个字符串,‍‍3个带换行的字符串,我们写入管道里面3个字符串之后,假设我们有10个任务,这个时候我们作为第一个任务的话,在执行这个任务之前,我要向管道里面去读取一个字符串,‍‍读了一个字符串之后,接着我就把这个任务放到后台去执行,就加上与这个符号&,那是不是第一个就正确执行了?‍‍

然后读取了第一个任务之后,这个时候管道里面是不是只有两个字符,‍‍ 接着再来,第二个任务的时候是不是要又向管道里面再取一个字符,第三个取,‍‍然后等到第四个的时候,这个管道里面是不是已经没有字符了?‍‍

这个时候这个系统里面其实已经相当于是启动了三个进程,‍‍ 但是第四个任务在执行的时候,它由于没有办法返回,‍‍因为它读这个管道里面的字符串它读不到,‍‍然后它这个任务就会阻塞在这里,后面要放到后台去执行的任务就没有办法执行,‍‍所以它就会一直阻塞在上面读的操作里面。‍‍一旦我们这个时候我们的系统里面是有三个进程去执行任务,‍‍我们在这个任务的最后,也就是说任务执行完了,‍‍但是它的最后需要做一个什么操作,它需要向管道去写入这样一个字符串。

也就是说你的任务执行成功了,‍‍我最后的话要向管道里面去写,‍‍相当于是把我原来消耗掉的一个任务,把消耗掉的一个字符串再把它写回到管道里面。‍‍这个时候当我这个任务执行结束之后,管道这个时候又多了一个字符串,‍‍原来阻塞在这里的任务是不是突然之间就是有字符串进来了,我就立马去读取这个字符串,‍‍接着又会有一个新的任务,就会启动一个新的进程去执行一个任务。‍‍

想象一下‍‍,是不是一个管道里面反正有三个字符串对吧?我们依次去读,这三个字符串读完了之后,第四个任务进来的时候就会阻塞在这里,‍‍然后等到每一个任务去执行完了之后,他就会把这个字符串重新再写回到这管道里面,‍‍这样子就能够保证这个系统里面最多只有三个进程在执行。‍‍第四个进程的时候是因为它‍‍管道里面是没有字符串的,所以说它永远会阻塞在这里。直到一个任务结束之后,管道里面有了字符串,第四个任务才能去执行。‍‍

这个时候系统里面还是只有三个,因为上一个已经结束了对不对,‍‍这样的一个原理,就是shell编程里面控制最大进程数的原理,就是通过这样一个管道实现的,‍‍后面我们也会通过这个原理来去自己手动编写控制多进程的一个shell脚本。‍‍

最后的话我们还会展示两个案例,帮助大家去理解shell编程,‍‍它在生产上是怎么用的。

Linux系统

最后的话我们还会给大家演示一下关于磁盘和逻辑卷的管理。‍‍

Linux系统

这是为了我们后面在做一些Python代码的时候,我们要做一些操作,我们要建一个逻辑卷,建一个卷了之后,比如说我们‍‍有一个的 1 g的目录, 我们想给它建1 g 的空间,有一个1 g的空间之后,然后我想把磁盘把它写满,‍‍就是说为了方便我们后续去做一些操作,然后做这些操作的时候,我们要能够理解磁盘,‍‍一个20g的磁盘是怎么样把20g的磁盘能够切成一个1 g的小磁盘,然后一个小逻辑卷,‍‍然后把小逻辑卷然后拿来使用,这是Linux运维里面的一些基础知识。‍‍

最后的话我们会来搭建一下两个Linux的一个基础服务,‍‍

Linux系统

在搭建这个服务过程中我们通过的比如说我们这个FTP服务我们会自己动手去实现一个shell脚本,‍‍那就是实现一键部署 FTP服务的一个脚本。



审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分