健康检查脚本
nmap:扫描端口
while true
do
healthy=`curl B:httpPORT/healthy -i | grep HTTP/1.1 | tail -n 1 | awk '{print $2}'`
done
批量操作类型脚本(记录每一步日志)
将100个nginx:vn推送到harbor仓库192.168.0.100
根据镜像对比sha值,来判断是否为你想要的镜像
批量部署脚本
功能:在一台机器上可以对所有机器进行操作
原理:给机子进行免密登录
批量分发脚本
网络测试类型脚本
用一些手段去获取域内所有主机的信息
举例:假如有dhcp分配IP,想查看哪些IP被占用。
用数组记录IP地址池,再for循环这个数组,ping这个IP地址,如果不通就没有占用,同时需要并行执行,这样可以同时用多个进程去执行命令,大大提高效率。
批量文本处理类型脚本
Grep -r aaa 是显示文件名和里面的东西
并发:QPS 每秒访问次数,不管有多少请求在1s内访问
并行:同一时间内并行发生。
文档对比认证
变量
变量赋值:= 、for i in、read
变量在内存中的存储,会在内存中空出一块内存,用来存变量名称和值。
!a的用法
#a 获取字符串长度
fileformat=unix 文件输出格式
·长短匹配
#左匹配 %右(单)匹配 %%长匹配
/是做匹配转换的,将双杠中间的数转换为后面的数。
字符串的切片操作,从第几个开始切,切到第几位。
数组
${array[@]} 比较常见,代表取所有,*也指取所有。
·批量注释:#号或
<<comment
Comment
变量的作用域
局部变量local (只能在函数块中使用)、全局变量(在一个进程中可以使用)、环境变量(继承给子进程使用)
$# 传递的参数的个数
$* 参数列举出来
$$ 显示进程号 $?查看上一条消息的返回码
-a的优先级高于-o的优先级,多重判断需注意使用。
运算符
Shell中默认所有的字符都是字符串
IFS表示默认分隔符(尽量不用)
计数器:
用sum清零来延缓网络波动性。
case 常在部署软件时使用
文件测试描述符
-b file 检测文件是否是块设备文件,如果是,则返回 true。[-b $file]返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。[-c $file]返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。[-d $file]返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[-f $file]返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。[-g $file]返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。「-k $file]返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。[-p $file]返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。[-u $file]返回 false。
-r file 检测文件是否可读,如果是,则返回 true。[-r $file]返回 true。
-w file 检测文件是否可写,如果是,则返回 true。[-w $file]返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。[-x $file]返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。[-s $file]返回 true。
文件描述符的范围0-255 文件流输入输出要有文件名fd来标识。
0是标准输出、1是标准正确输出、2是错误输出
只要有文件传输就会有文件流,有文件流输出输出必有描述符。
资源分配的最小单位是进程,
当CPU上下文切换,也是进程切换。
进程和线程的区别:
有没有分配共享出来的资源
执行环境与资源:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位1。每个进程都有自己独立的地址空间、文件描述符等资源23。而线程是进程内的一个执行单元,共享进程的地址空间和资源,如内存空间、文件等。
通信与切换开销:进程之间的通信需要通过显式的机制,如管道、消息队列和共享内存等来实现,因此通信开销相对较大。而线程之间可以直接读写进程共享的数据,通信更加方便和快捷3。同样,由于线程共享进程的资源,创建、销毁和切换线程的开销相对较小,而进程由于具有独立的资源,其创建、销毁和切换的开销相对较大。
并发性与独立性:进程是独立的执行单元,具有自己的调度算法,在并发条件下更加稳定可靠。而线程共享进程的资源,线程之间的调度和同步比较复杂,对并发条件的处理需要更多的注意。
管理与安全:进程的管理相对复杂,需要操作系统的支持。而线程的创建和销毁相对简单,可以更灵活地进行管理3。另外,进程间的地址空间隔离使得不同进程的数据互不影响,因此更加安全可靠。线程间则需要考虑共享数据的安全性和避免竞争条件。
总结来说,进程和线程在执行环境、资源、通信、切换开销、并发性、独立性、管理以及安全性等方面都存在显著的区别。了解这些区别对于编写高效、安全和可靠的程序至关重要。
内核态(发生在ring0级别的内核调用),凡是和硬件直接相关的都是内核态、用户态(发生在ring3级别的内核调用),在硬件上被软件一层层赋予的大概是用户态
Ring0是系统的开关机、严格的资源访问;ring3是用户开的一些进程。
从用户态到内存态在内存上是消耗资源的。像网卡、网络等这种和硬件直接相关的都是内核态;在硬件上做一层层的软件处理的大概率是用户态。
生产者、消费者问题
一个生产者、一个消费者,中间有缓存空间。生产者和消费者不用直接联系,只需连接中间的缓存空间即可。
异步:请求管道、完成管道,记录着客户端是谁,客户的请求资源是谁,返回的资源是谁
一般情况下,在做生产者和消费者时,当其中一个消费者去访问的时候,会涉及到一个加锁问题lock,会直接将你的读写权限锁掉,将其他进程对你中间管道读写权限锁掉,其他过来读是无权限的
在整个生产者、消费者流程中若有某个节点数据填满,而导致整个服务流程无法进行,那么就叫死锁。
互斥锁:解决多个进程对同一个进程改变的问题。互斥锁用来保护共享资源,确保在任意时刻只有一个线程能够访问共享资源,从而避免数据竞争和不一致性问题。
扩展
高可用:遇事不决,冗余部署
对象:是抽象出来的一种属性,类如果被赋值,就被称为对象
总结
使用myctl命令来统一的部署和管理服务
把对象作为对象参数,传递给方法。
声明式编程和命令式编程的区别:
·命令式:按照既定要求完全执行
说一遍做一遍
·声明式:声明要做的水平,按照目标去完成。
声明要做的结果是什么
第一步:知道有哪些node
第二步:应该如何调度这些服务
第三步:数据存储要留痕
第四步:数据中心 确保命令执行是幂等的。
生产者是敲命令的,生成一套模板,消费者去执行命令。
Myctl是个命令入口,生产者生成一套模板存放于数据中心,消费者从数据中心拿到数据去做任务,去找到节点。
节点控制组件监听数据中心,到底哪个服务要往我上面调度。
设计模板
myctl命令接入点,启用时调用即可。将模板放入数据中心,24小时存活。
数据存储中心需要有个服务。 控制器目的是监听,也需要24小时存活,它也是服务,而节点控制组件也许24小时存活。
http协议
Restful风格,API接口
状态是数据差异性。无状态:浏览器就是无状态的应用。有数据差异性就是有状态的;无数据差异性的就是无状态的。
GET是默认缓存的,而PORT是默认不缓存的。
·RPC协议:传输数据的协议,负载小、效率高。微服务架构内部,要求访问速率,需要gRPC
hook:钩子,如鼠标,
Webhook本质是一种基于HTTP的回调接口,会在用户自定义的应用/页面自动发出对应的消息。 有时 Webhook 被称为反向 API,但这并不完全正确。 它们不会向后运行,而是不需要您主动发起请求,只要有新数据可用,就会发送数据。
- listen数据中心,拿模板
- 找调度器计算结果
- 处理数据丢尽管道
·高可用:保持运行的server,线上负责关键角色的server需要做高可用
实现高可用的方式:遇事不决冗余部署。
面向对象:
面向对象的思想是编程领域中的一种重要方法论,它强调将现实世界的事物抽象为对象,并通过对象之间的交互来实现复杂的功能。这种思想在软件设计和开发中有着广泛的应用,能够显著提高代码的可维护性、可重用性和可扩展性。
面向对象的思想主要包括以下几个方面:
1. **抽象**:抽象是面向对象思想的核心。它允许我们忽略事物的细节,只关注其本质特征和行为。通过抽象,我们可以将现实世界中的事物表示为程序中的对象,并定义对象的属性和方法。
2. **封装**:封装是面向对象编程的基本特性之一。它通过将数据和操作数据的方法绑定在一起,形成一个个独立的对象。封装可以隐藏对象的内部状态和实现细节,只暴露必要的接口给外部使用,从而保护数据的安全性并降低耦合度。
3. **继承**:继承是实现代码重用的重要手段。它允许我们创建一个通用的基类,并定义其属性和方法。然后,通过继承这个基类,我们可以创建具有更多特定属性和方法的派生类。这样,派生类就可以继承基类的所有属性和方法,并添加自己的特定实现。
4. **多态**:多态是面向对象编程的又一重要特性。它允许我们使用父类类型的引用指向子类对象,并在运行时根据对象的实际类型来调用相应的方法。这使得我们可以编写更加灵活和可扩展的代码,能够适应不同的需求和场景。
通过运用面向对象的思想,我们可以更好地组织和管理代码,提高软件的可读性和可维护性。同时,面向对象的思想也有助于我们更好地理解和分析现实世界中的复杂问题,从而找到更加有效的解决方案。
脚本练习
1.随机n个元素的数组(n>10),输出相邻4位元素大于20的元素数组集合
#!/bin/bash
n=20
random_array=()
for ((i=0; i<$n; i++)); do
random_num=$((RANDOM % 101)) # 生成0-100的随机数
random_array+=($random_num)
done
echo "原始数组:"
for element in "${random_array[@]}"; do
echo $element
done
for ((i=0; i<${#random_array[@]}-3; i++)); do
# 计算当前四个元素之和
sum=$((random_array[i] + random_array[i+1] + random_array[i+2] + random_array[i+3]))
if ((sum > 20)); then
echo "元素集合: ${random_array[i]} ${random_array[i+1]} ${random_array[i+2]} ${random_array[i+3]}"
fi
done
2.健康检查脚本
3. 镜像批量拉改推脚本,sha值比对
给脚本执行权chmod +x 3.sh
./3.sh
4.批量命令,分发脚本
创建一个包含服务器列表的文件(例如servers.txt),每行一个服务器的IP地址或主机名
5.网络探测脚本,主机ip,端口
6.文本校对替换脚本
7. nginx日志根据时间统计人数,访问量,单人访问次数,并发数
8.跨主机实现的一个生产者消费者模型
使用流程控制语句结合组织8个功能