主要介绍两部分,
对于shell编程来说,主要有以下三个特点。第一是简单高效,第二是功能强大,第三是便携性。
因为他把我们所有的linux命令都放到了shell编程中,然后加上循环和判断,实现了这样一个脚本。这样,我们就可以实现各种想要的功能。
作为运维人员,编写所需的脚本是我们自动化的开始。首先,shell编程会有一个误区,
当我们第一次接触shell编程时,我们以为应该把那些Linux命令直接放入脚本中。这样的话,我们一开始会认为shell编程其实就是Linux命令的堆砌在一起,但如果我们从简单的shell编程的角度来思考,其实就是Linux命令,加上一些编程语法。例如,如果我们在Linux命令中添加一个if判断,则如果该命令执行成功,我们将执行下一条,否则将输出一条消息。 就是这样一个命令,加上一些语法之后,就形成了这样一个shell脚本。
以下三个是我们的经验。首先第一个是运维的核心,就是在正确的节点上正确执行这些正确的Linux命令。 比如我们想在某个节点上启动某个服务,对吧?我们需要远程登录到这个节点,然后执行一个操作来启动服务,或者我们需要执行一个操作来重新加载服务。那么运维工具的本质是什么?表示可以远程登录该节点执行Linux命令。这是很多运维工具的基本功能。
比如后面我们要用到的ansible和saltstack就会有这样的基本功能。这也是我们作为用户会经常使用的一个功能。
那什么是运维开发呢?也就是说,我们需要经常登录某个节点,然后做一些动作来收集数据,或者发送邮件通知。如果节点出现异常,我们需要报警,我们会采取这些行动。之前我们必须手动完成的这些步骤都是用代码和脚本编写的。我们通过Python来运行脚本,或者将其写成shell或者放入计划任务中进行定时执行。 这样我们就实现了自动化开发。
我们运维开发主要就是把我们手工操作写成代码,然后放到代码里,然后有代码来帮助我们执行,实现操作的自动化。至少如果我们能够实现的话,我们可以节省我们的运维工作。人员时间。
好吧,shell编程中的一些重要概念其实和大多数编程语言是一样的,所以我们要看到shell编程中是有变量的,
变量定义、字符串、数组的一些操作、判断计算。计算就是简单的加、减、乘、除,然后还有浮点运算等等,如果需要的话,在shell中也可以使用。函数的概念。
另外,shell的功能也和我们其他高级语言的功能不同,比如Python或者C、C++。传递的参数比较特殊。我们通过位置参数传递。
接下来我们会在shell编程的实战中看到这一点,那么参数的时候实际上会分为哪些呢?函数参数和脚本参数统称为位置参数。
然后是循环。我们核心的事情是实现一个叫做多进程的操作。 好了,shell里面有判断条件和循环语句。这些都是最基本的判断语句,最基本的就是if。
For循环主要有三种语句:for while和until。
shell中多进程的主要实现是什么?
为了实现这样的后台执行服务,我们执行一个操作或者调用一个函数。我们在操作或者&符号后面加上符号&,这个操作或者这个函数中的任务就会被放到后台,自动启动一个进程来执行,但是就会出现问题。假设我有 100 个这样的操作,我向每个操作添加 &。 ,在这种情况下,会在后台启动100个进程来分别执行这些操作。在这种情况下,我们没有办法控制进程的数量。
&
&。 ,在这种情况下,会在后台启动100个进程来分别执行这些操作。在这种情况下,我们没有办法控制进程的数量。
如果我们假设有 10,000 个任务,我们真的可以在一个节点上使用 10,000 个进程来执行这些操作吗? 这种情况下,效率实际上会急剧下降,因为进程之间的开销实际上是一个非常大的开销。 也会占用大量时间,甚至导致节点无法执行。
我们需要控制每次启动的进程数量。 控制进程数量的核心之一就是通过文件描述符和管道的配合来执行。 是如何执行的,我这里画了这么一张图。
我们先来看看这个管道。管道的特点之一是管道中有10条数据。 如果我想从管道中读取一条数据,此时管道中的数据量会减少吗?一,假设我的管道中没有数据。当我阅读时,我想从管道中读取一个操作。这个时候这个操作其实会阻塞在这里,不会返回,一直阻塞到这里,直到什么时候返回呢?当我从另一个操作(如管道)写入字符串时,此处被阻止的操作可以立即接收该字符串,然后其操作将返回。
这样我们如何控制最大进程数呢?这很简单。比如我们的管道里有3个字符,它本身就有3个字符串,3个带换行符的字符串,我们往管道里写入3个字符。在字符串之后,假设我们有10个任务,如果此时我们是第一个任务,那么在执行这个任务之前,我需要读取一个字符串到管道中。读完一个字符串后,我然后在后台执行这个任务时,添加符号&。首先它执行得正确吗?
看完第一个任务,此时管道里是不是只有两个字符?那么又来了,是不是需要在第二个任务的时候再从管道中取出一个字符,然后取出第三个字符呢? ,然后到了第四次的时候,管道里就没有字符了吗?
此时系统实际上相当于启动了三个进程。但是当第四个任务执行时,它没有办法返回,因为它无法读取管道中的字符串。 那么它的任务就会阻塞在这里,后续要在后台执行的任务就无法执行,所以会一直阻塞在上面的读操作中。 一旦我们的系统中此时有3个进程来执行任务,我们就到了这个任务的末尾,也就是说这个任务已经执行完毕了。但最后需要做什么操作呢?它需要写入管道。这样的字符串。
也就是说,你的任务执行成功了。 我的遗言将被写入管道。 相当于把我原来消费的任务拿过来,把消费的字符串写出来,然后写回管道。 此时,我的任务执行结束后,管道中又多了一个字符串。 原本阻塞在这里的任务突然有一个字符串进来,我立即读取了这个字符串。 然后就会有新的任务,会启动一个新的进程来执行任务。
想象一下。一根管子里有三根弦,对吗?我们依次阅读它们。读取完这三个字符串之后,第四个任务进来的时候就会被阻塞在这里,然后每个任务执行完之后,他都会把这个字符串写回到这个管道中,这样可以保证最多只有三个进程在执行系统。 第四个进程是因为它的管道中没有字符串,所以会一直阻塞在这里。直到一个任务结束并且管道中有字符串时,才能执行第四个任务。
这个时候系统里还只有三个,因为上一个已经结束了吧?这样的原则就是shell编程中控制最大进程数的原则。就是通过这样一个管道来实现的。我们也会利用这个原理手动编写一个shell脚本来控制多个进程。
最后,我们还会展示两个案例,帮助大家了解shell编程以及如何在生产中使用。
最后,我们还将向您展示磁盘和逻辑卷的管理。
这个是为了我们后面做一些Python代码的时候做一些操作。我们需要创建一个逻辑卷。创建卷后,例如我们有一个1g的目录。我们想给它创造1GB的空间。当有 1 GB 空间后,我想用它填充磁盘。也就是说,为了方便我们后续的操作,我们在做这些操作的时候必须能够了解磁盘。如何将20g的磁盘切成1g的小磁盘,然后是小逻辑卷,然后使用小逻辑卷。这是Linux运维的一些基础知识。
最后,我们将为两个Linux构建一个基础服务,
在搭建这个服务的过程中,比如我们的FTP服务,我们会自己实现一个shell脚本,这个脚本是实现FTP服务一键部署的脚本。