27届春招备战一轮复习--第五期
----作者:王贵祥
- 27届春招备战一轮复习--第五期
- 这边你其实有提到ansible,你有写过playbook嘛?你写过那些功能呀,简单讲一讲
- 问: 之前你有用过header这种模块嘛?
- 问: 你有用过role的吗
- 问: role文件下会放那些目录功能呢
- 问: 有task文件吗,一般会放一些什么
- 再问一个网络的问题吧,因为我看你简历没怎么写网络,到有提到网络应用,正常的话,我的四次挥手的时候吧,假如说,我的服务有大量的close wait状态 ,是什么原因呢?
- 四次挥手的过程你知道吗? 回答: 四次挥手过程熟悉的,close wait是关闭什么来着,关闭连接?具体的这个业务我 还是不太明白,但是四次挥手还是熟的 问: 那你说一下四次挥手过程
- 问: 那你知道这个close wait是什么状态嘛?第一次客户端发送数据包给服务端,服务 端回客户端之后,服务端处于一个什么状态呀,转态机制怎么样 回答: 那个状态机制是一个等待关闭的一个状态吧 问: 那是一个什么状态知道吗
- 问: 假如我想服务器上有大量的Tcp连接吗,想看我这个进程有那些,TCP连接都处于 什么状态,一般用什么命令看
- 问: netstat怎么拼的
- 我这边问题问完了,我出一道算法题吧,我不确定你前面代码能力经验怎么样,可以难一点还是简单一点的? 我的代码能力的话算是一种基础吧
- 补充三次握手
- 为什么连接的时候是三次握手,关闭的时候却是四次握手?
- 为什么要等待2MSL?
- 算法
- 解答(尽量分三份,知道这个技巧的会简单很多)
这边你其实有提到ansible,你有写过playbook嘛?你写过那些功能呀,简单讲一讲
回答: 像安装软件包,yum模块这种,还有启动一个http服务呀,用service,还有开启防 火墙,firewalld这个模块,还有创建磁盘去挂载它,用block这个模块,还有使用定时 任务,创建一个user,像user模块呀,Cronjob模块,像这些都有配过
问: 之前你有用过header这种模块嘛?
回答: 没有,这个没有太多的接触
问: 你有用过role的吗
回答: 你说是角色吗,有用过的
问: role文件下会放那些目录功能呢
回答: 会放一些要求文件,比如requestments,根据他去做一些批量的处理这样子
[root@ansible roles]# tree apache/
apache/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars└── main.yml#defaults/main.yml:定义角色默认变量,优先级低,可被其他变量覆盖
#files/:存放静态文件,供任务中copy等模块直接使用
#meta/main.yml:记录角色元数据,如作者、依赖关系、支持的平台等
#tasks/main.yml:定义角色核心任务,是角色执行逻辑的主要部分
#templates/:存放 Jinja2 模板文件,用于动态生成配置文件
#tests/:包含测试相关文件,用于验证角色功能
#vars/main.yml:定义角色私有变量,优先级高,通常不允许被覆盖
处理器(handlers)是 Ansible 中一种特殊的任务,它类似于普通任务,但只在被明确调用时才会执行,通常用于响应某个状态变化后的操作。
handlers/main.yml
的主要作用是:
- 定义一系列需要在特定条件下触发的操作(如服务重启、配置重载等)
- 这些操作不会自动执行,需要通过其他任务中的
notify
关键字来调用
例如,在 handlers/main.yml
中可能会定义这样的内容:
- name: restart apacheservice:name: httpdstate: restarted- name: reload apacheservice:name: httpdstate: reloaded
问: 有task文件吗,一般会放一些什么
回答: 有的,会放一些初始化的角色,像前面有提到过创建磁盘呀,block的也有
提示不要带偏了:
他会放一些:
- 安装软件(如
yum
或apt
模块安装 Apache) - 配置文件操作(如
copy
或template
模块部署配置) - 服务管理(如
service
模块启动 / 启用服务) - 权限设置(如
file
模块调整文件权限) - 依赖检查(如确认必要目录存在)
- 其他需要执行的操作步骤
再问一个网络的问题吧,因为我看你简历没怎么写网络,到有提到网络应用,正常的话,我的四次挥手的时候吧,假如说,我的服务有大量的close wait状态 ,是什么原因呢?
-
未正确释放连接资源:代码在使用完 Socket 或网络连接后,没有在
finally
块或合适的生命周期回调函数中调用close()
方法。例如,发生异常时,导致关闭语句被跳过。 -
长周期操作阻塞:应用程序在收到
FIN
后,可能还在执行一个非常耗时的操作,迟迟没有走到关闭连接的代码处,使得连接长时间处于CLOSE_WAIT
状态。 -
资源竞争或死锁:极少数情况下,应用程序可能因为死锁而无法执行到关闭连接的代码,从而导致连接一直保持在
CLOSE_WAIT
状态。
四次挥手的过程你知道吗? 回答: 四次挥手过程熟悉的,close wait是关闭什么来着,关闭连接?具体的这个业务我 还是不太明白,但是四次挥手还是熟的 问: 那你说一下四次挥手过程
回答: 客户端向服务端发送数据包SYN置为1,随机产生一个seq随机数为 j。。。。。。。。。。
问: 那你知道这个close wait是什么状态嘛?第一次客户端发送数据包给服务端,服务 端回客户端之后,服务端处于一个什么状态呀,转态机制怎么样 回答: 那个状态机制是一个等待关闭的一个状态吧 问: 那是一个什么状态知道吗
回答: 这个比较深度的还没有太多研究
问: 假如我想服务器上有大量的Tcp连接吗,想看我这个进程有那些,TCP连接都处于 什么状态,一般用什么命令看
回答: 看进程的话,用top命令嘛,还有htop,还有vmstat 问: 看tcp连接的情况 回答: 先查看ipconfig?或者查端口,ss、netstat这种,
-
先找到进程的 PID(根据进程名或端口):
# 通过进程名查找 ps -ef | grep 进程名# 通过端口查找(比如8080端口) netstat -tlnp | grep 8080 # 或 lsof -i :8080
-
查看该进程的所有 TCP 连接及状态:
# 方法1:netstat(需指定PID) netstat -antp | grep 进程PID# 方法2:ss(更高效,推荐) ss -antp | grep 进程PID# 方法3:lsof(可看到更多文件描述符细节) lsof -p 进程PID | grep TCP
问: netstat怎么拼的
回答: nelnet
看来这边应试者回答错了捏
是netstat
我这边问题问完了,我出一道算法题吧,我不确定你前面代码能力经验怎么样,可以难一点还是简单一点的? 我的代码能力的话算是一种基础吧
ok,出了一个合并两有序数组 过了两分钟。。。。编程题还是准备的不是很充分 ## 那你要说一下思路吧?
补充三次握手
为什么连接的时候是三次握手,关闭的时候却是四次握手?
建立连接时因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。所以建立连接只需要三次握手。
由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式。这就意味着,关闭连接时,当Client端发出FIN报文段时,只是表示Client端告诉Server端数据已经发送完毕了。当Server端收到FIN报文并返回ACK报文段,表示它已经知道Client端没有数据发送了,但是Server端还是可以发送数据到Client端的,所以Server很可能并不会立即关闭SOCKET,直到Server端把数据也发送完毕。当Server端也发送了FIN报文段时,这个时候就表示Server端也没有数据要发送了,就会告诉Client端,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
为什么要等待2MSL?
MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。
算法
现需要将一根长为正整数 bamboo_len
的竹子砍为若干段,每段长度均为正整数。请返回每段竹子长度的最大乘积是多少。
示例 1:
输入: bamboo_len = 12
输出: 81
class Solution:def cuttingBamboo(self, bamboo_len: int) -> int:
解答(尽量分三份,知道这个技巧的会简单很多)
class Solution:def cuttingBamboo(self, bamboo_len: int) -> int:if bamboo_len <= 1:return 0if bamboo_len == 2:return 1if bamboo_len == 3:return 2remainder = bamboo_len % 3#求他的余数if remainder == 1:# 余1时,将最后一个3和1分成2+2(因为2×2>3×1)return (3 **((bamboo_len - 4) // 3)) * 4elif remainder == 2:# 余2时,直接乘以2return (3** (bamboo_len // 3)) * 2else:return 3 **(bamboo_len // 3)