0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至配饺子 来源:基根奋斗营 作者:keagen 2022-08-19 15:14 次阅读

主要是介绍两个部分,

pYYBAGL_N2eABiJGAABpNOD71vU324.png

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

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

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

pYYBAGL_N3yADaYTAACR63dGXO4493.png

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

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

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

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

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

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

poYBAGL_N5KACcZMAACNGR--YYM056.png

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

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

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

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

poYBAGL_N6WACUXzAACRN5SBZlI933.png

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

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

pYYBAGL_N7qAc0rJAACQjwBwki8898.png

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

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

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

pYYBAGL_N8-AcODhAACqA9hEaIM475.png

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

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

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

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

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

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

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

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

pYYBAGL_N-OAYzvcAACqNQfDr5c137.png

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

pYYBAGL_N_eAdhRLAABxIFJ_JO4550.png

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

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

pYYBAGL_OAuASE1uAABTXUyHEKg024.png

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



审核编辑:刘清

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

    关注

    4

    文章

    590

    浏览量

    27325
  • FTP
    FTP
    +关注

    关注

    0

    文章

    107

    浏览量

    40572
  • shell编程
    +关注

    关注

    0

    文章

    10

    浏览量

    5873
收藏 人收藏

    评论

    相关推荐

    跪求LabVIEW多进程问题,谢谢各位

    进行处理。但是这样就不是多线程并行了,相当于几个站点是顺序执行的,就像读取数据时候就是先读第一个站点的数据放进第一个队列,再读第二站点的数据放进第二队列......这样,我想这样点
    发表于 04-04 16:34

    实验:编写多进程程序

    1.实验目的 通过编写多进程程序,使读者熟练掌握fork()、exec()、wait()和waitpid()等函数的使用,进步理解Linux
    发表于 09-05 15:32

    Linux Shell多进程并发以及并发数控制

    Linux Shell多进程并发以及并发数控制1. 基础知识准备1.1. linux后台进程Unix是多任务系统,允许多用户同时运行多个
    发表于 08-28 15:53

    labview有多进程吗?

    labview有多进程吗?
    发表于 02-03 17:13

    多线程和多进程的区别

    6.你的数据库会又500连接数,会有10,你分析下情况7.udp和tcp的区别8.多线程和多进
    发表于 07-19 07:21

    浅谈多进程多线程的选择

    鱼还是熊掌:浅谈多进程多线程的选择关于多进程和多线程,教科书上最经典的句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作
    发表于 08-24 07:38

    LINUX系统下多线程与多进程性能分析

    采用多进程处理多个任务,会占用很多系统资源(主要是CPU 和内存的使用)。LINUX ,则对这种弊端进行了改进,在用户态实现了多线程处理
    发表于 08-13 08:31 20次下载

    Zynq SoC上实现双核非对称的多进程处理模式

    我的上篇博客我介绍了利用Zynq SoC上的两ARM Cortex-A9 MPCore处理器执行不同的任务程序,实现非对称的
    发表于 02-11 10:08 2329次阅读
    <b class='flag-5'>在</b>Zynq SoC上<b class='flag-5'>实现</b>双核非对称的<b class='flag-5'>多进程</b>处理模式

    进程控制开发之编写多进程程序实验解析

    7.4.1 编写多进程程序 1.实验目的 通过编写多进程程序,使读者熟练掌握fork()、exec()、wait()和waitpid()等函数的使用,进步理解Linux
    发表于 10-18 16:33 0次下载
    <b class='flag-5'>进程</b>控制开发之编写<b class='flag-5'>多进程</b>程序实验解析

    使用Python多进程的理由

    Python 是运行在解释器的语言,查找资料知道, python 中有全局锁( GI),使用多进程( Threa)的情况下,不能发挥
    的头像 发表于 04-04 16:50 1569次阅读
    使用Python<b class='flag-5'>多进程</b>的理由

    Python多进程学习

    ) 技术不同,因为多线程的并发任务依赖于 GIL (Global Interpreter Lock)。多进程,每个
    的头像 发表于 04-26 11:04 519次阅读

    浅谈Linux网络编程多进程和多线程

    Linux网络编程,我们应该见过很多网络框架或者server,有多进程的处理方式,也有多线程处理方式,孰好孰坏并没有可比性,首先选择多进程还是多线程我们需要考虑业务场景,其次结合当
    发表于 08-08 16:56 789次阅读
    浅谈Linux网络编程<b class='flag-5'>中</b>的<b class='flag-5'>多进程</b>和多线程

    shell脚本实现并发多进程

    Shell脚本实现并发多进程可以使用以下方法: 使用符号来将其放入后台执行,从而实现并发
    的头像 发表于 11-08 10:20 1242次阅读

    你还是分不清多进程和多线程吗?文搞懂!

    你还是分不清多进程和多线程吗?文搞懂! 多进程和多线程是并发编程中常见的两概念,它们都可以用于提高程序的性能和效率。但是它们的实现方式和
    的头像 发表于 12-19 16:07 528次阅读

    Python多线程和多进程的区别

    Python作为种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之本文中,我们将探讨Python多线
    的头像 发表于 10-23 11:48 254次阅读
    Python<b class='flag-5'>中</b>多线程和<b class='flag-5'>多进程</b>的区别