Linux Shell 多进程

简介: Linux Shell 多进程

前段时间,我们一直在分享podman基础知识,我感觉差不多了,收货慢慢,后面想介绍一下podman restful,我们写一个基于容器的运维平台出来,不过只是构想,目前还在看demo,余下还有时间,我们看看shell,按照规矩,我们以某个点开头,本篇我们以linux shell多进程打头。




什么是进程、进程、协程序


众所周知,在linux中是没有线程概念的,所以,linux只有进程概念

我自己的理解


什么是进程,线程,协程 他们的关系又是怎么样的?


进程是线程的集合

所以线程会共享进程的堆栈,故 线程可以使用进程的变量信息

线程是内核级别

协程是用户级别

CPU的核数 等于 内核线程的最大数量


在linux中实现简单的多进程


shell多进程需要注意的点


  1. 某些代码需要执行多进程的,需要放入后台执行,中间使用 { 代码 }& 即可, 比如: 需要讲输出hello world 写成多进程的,这样的话,就会放在后入执行了

其实这也不难理解,因为我们通常要将执行命令放入后台,一般为: ./xxxx &,脚本中也是类似的

顺序执行

image.png


执行结果

image.png

同时执行

image.png


执行结果

image.png


我们sleep时间调整的长一些,我们可以看看具体进程树

image.png



我们执行成功后,看看进程树,使用命令ps axjf

可以看到其实我们对于shell多进程,其实就是在系统中启用多个命令,仅此而已。

image.png


  1. 在执行多进程时,如果我们需要多进程执行完毕后再执行后续语句,那么,我们需要在多进程后面添加wait命令,此命令会等待后台进程执行完毕后再开始执行

我们尝试在脚本中加入wait

image.png


执行

我们可以看到,它其实是等待了3秒

image.png

这个到底有什么用? 我们通过例子说明



在linux shell中如何使用多进程错误案例

例子

有如下脚本

该脚本作用于将文件拷贝至backs , 并且将其打包为tar.gz 格式

image.png


执行结果如下

image.png


执行完毕后,我们发现backs目录中有数据,而backs.tar.gz文件则为空的压缩包

image.png


这是因为我们循环中都放入后台运行了,且没有等待执行完毕,就执行打包操作,就造成了这样的局面,拷贝还没结束,打包就结束了,这样就有空包了,我们修改一下脚本,在循环结束后,加入一个wait,这样该脚本才不会有问题

image.png



linux shell 控制进程数量


为什么我们需要控制进程数量

上述简单的多进程,能够帮助我们运维提高效率,但是也有致命缺陷,就是假设我们不知道循环次数的时候,贸然使用改脚本,则会出现问题,稍不注意就会饭碗不保,脚本如下

image.png


该脚本看上去好像没啥问题,但是我们忽略了一点,那就是数据库表到底有多少? 每张表有多大?

假设该数据库下有1w张表,每张表有100M, 那我们在1s内建立1w个连接去拉取数据库? 线上库都要玩蹦,抛出至理名言:“业务和我有一个能跑就成”?


所以基于上述原因,若无法预估执行次数,可能会导致服务器性能被压满,我们才需要控制脚本在后台中的数量。


在linux shell如何控制进程数量


我们将脚本简化一下,仅输出信息即可,稍后做出解释

image.png


执行效果如下

可以看到,程序是按照2个2个一组执行的

image.png



控制进程原理解析


创建管道文件


image.png


其实上面最主要的就是管道,众所周知,管道可以分为两种,1.匿名管道 2.命令管道 , 匿名管道就是我们最常见使用的 | 例如:ls -l | grep 123,而使用mkfifo则可以创建命令管道


exec 创建文件的标识符,系统中存在的标识符,为 012stdin,stdout,stderr, 代码中的 exec 1000<>/tmp/tests.fifo 其实定义的是输入和输出描述符,其标识符为1000


进程个数调节

image.png

这一步,它会首先向管道中写入2个值,可以发现这边是没有wait的,所以说,它会与下面并发执行



多进程本身

image.png

这个多进程语句和之前语句类似,唯一的不同是,多了一个往管道取值的动作还有复写管道的动作,以此来实现进程个数控制。



感想


在实际的运维工作中,很少使用shell 多进程,原因是因为在多数情况下,用shell编写的都是很简单的程序,什么时候需要用到shell多进程呢? 正如上述所述,我们一般在备份数据、导入导出数据库的时候,使用多进程更多,但是我们一般会控制进程,毕竟,慢不要紧,要稳一点,如果把线上环境搞瞎了,可不好玩,作为一个运维小学生,我对运维行业,或者对线上正常跑的程序,始终都保持有敬畏之心,保证所有的命令,都是经过自己思考和确认的,避免引起误操作,哎呀,说多了,后期可以讲讲,运维有些误操作后,收拾起来有多恶心。







相关文章
|
12天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
35 1
|
7天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
15天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
1月前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
133 4
linux进程管理万字详解!!!
|
20天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
21天前
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
30 0
Linux 如何更改默认 Shell
|
1月前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
71 8
|
27天前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
56 1
|
27天前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
1月前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
70 4