都说 linux 下一切皆文件,你是怎么理解的?

Linux中所有内容都是以文件的形式保存和管理的。普通文件、目录、硬件设备、套接字、网络通信等资源都是文件。好处就是开发者仅需要使用一套 API 和开发工具即可调取 Linux 系统中绝大部分的资源。举个简单的例子,Linux 中几乎所有读(读文件,读系统状态,读 socket,读 PIPE)的操作都可以用 read 函数来进行;几乎所有更改(更改文件,更改系统参数,写 socket,写 PIPE)的操作都可以用 write 函数来进行。

都说 socket 在 linux 实际是一个文件,是通过什么技术将 socket 变成一个文件的?

linux 下软 /硬连接是什么,他们有什么区别?

inode可以用来区分不同的文件,如果一个inode对应多个文件名,则这些文件称为硬链接。硬链接就是同一个文件使用了多个别名,删除时只会删除链接,不会删除文件。硬链接不能引用自身文件系统以外的文件,即不能引用其它分区的文件,还不能引用目录 软链接与硬链接类似,不过没有硬链接的局限性,类似快捷方式。使用方法跟硬链接相同。

# 硬链接
ln source dst

# 软链接 使用-s 参数
ln -s source dst

硬链接之后查看每一个文件都能看到跟源文件一样的信息,在硬链接后的文件上做的修改也能改变源文件,建立新链接之后删除源文件,链接文件也不会消失,只有同时删除才会消失。另外虽然查看文件大小时,会发现源文件跟目标文件大小一样,但空间占用上只有一个文件的实际占用。 软链接之后无法看到源文件的具体信息,只是类似一个快捷方式,一旦源文件被删除或移动,软链接则会失效。

linux 下一个用户登录以下文件加载顺序是?~/.bash_profile, ~/.bash_login, ~/.profile, ~/.bashrc, /etc/profile

在刚登录Linux时,首先加载/etc/profile,然后再依次加载用户目录下的~/.bash_profile ~/.bash_login~/.profile。如果~/.bash_profile文件存在的话,一般还会执行~/.bashrc文件。因为在~/.bash_profile文件中一般会有以下代码:

if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

~/.bashrc 中一般还会有以下代码:

if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

所以 ~/.bashrc会调用 /etc/bashrc文件。最后在退出shell时,还会执行~/bash_logout文件

关于这几个文件的作用: /etc/profile:此文件为系统为每个用户设置的环境变量信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜索shell的设置 etc/bashrc:为每一个运行bash shell的用户执行些文件 ~/.bash_profile:每个用户都可以用该文件输入专属的shell信息,该文件只在用户登录时执行一次。默认用于加载环境变量和执行用户的.bashrc文件 ~/.bashrc:该文件包含当前用户的bash shell信息,每次及新打开shell时,该文件被执行 ~/.bash_logout:每次退出bash shell时,执行该文件。

都说 systemd 他可以并行启动,他的实现原理是? 僵尸进程 /孤儿进程他们是?区别是啥?为什么说 ssh 很安全?具体原理是?如何保证的

shell 相关 [[]] [] (()) () 他们区别是?

[]

  1. 跟[[test命令]]一样,是一个bash内部命令,都是用于测试;test[]中可用的比较运算符只有 ==!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用 -eq-gt这种形式。整数或字符串都不支持<>这种比较符号

  2. 用于表示一个字符范围,例如:cat file | grep [a-z],过滤出字母a-z的匹配关键字.

[[]]

  1. 是bash程序语言中的关键字,在[[]]中间所有的字条都不会发生文件名扩展或者单词分割, 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,例如 [[ hello == hell? ]],结果为真,[[]]中匹配字符串或通配符不需要引号。

  2. 另外,使用[[...]] 条件判断结构相比[...]能够防止脚本中的许多逻辑错误,比如 &&||< >操作符能够正常存在于[[]]条件判断结构中,而在[]中则会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]]

  3. bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码

(())

  1. 结构扩展并计算一个算术表达式的值。如果表达式值为0,会返回1或假作为退出状态码。如果表达式值不为0,会返回0或真做为退出状态码。

  2. 只要括号中的运算符、表达式符合C语言运算规则,都可以用在$((exp))中,甚至是三目运算符。

  3. 做不同进位(如二、八、十六进制)运算时,输出结果全都自动转换成十进制。例如:echo $((16#5f))结果为95(5f这个16进制数转成10进制)

  4. 常用于算术运算比较,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)), 如果不使用双括号, 则为for i in $(seq 0 4)或者for i in {0..4}

()

  1. 是一个命令群组,有时在一定条件下要执行多个命令(要么都执行,要么都不执行),类似数学运算中的2*(3+4)一样。

  2. 命令替换,$(cmd)等于`cmd`

  3. 初始化数组。例如:array=(a b c)

{}

  1. 对大括号中的文件名做扩展。在大括号中不许有空白,除非这个空白被引用或转义。一种是对大括号中的以逗号分割的文件列表进行拓展。例如 touch {a,b}.txt,生成a.txt 和 b.txt。另一种是对大括号中以点点分割的顺序文件列表进行拓展。例如:touch {a..d}.txt,生成a.txt b.txt c.txt d.txt

  2. 代码块,也被称为内部组,这个结构事实上创建了一个匿名函数。与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,即脚本凭余下部分仍可使用括号内变量。括号内的命令用分号隔开,最后一个也必须有分号。

  3. 特殊替换,

${var:-string} # 若变量var为空,则调用时用string来给var变量赋值,不为空则维持原值
${var:+string} # 若变量var不为空,则调用时用string来给var变量赋值,为空则维护原值
${var:=string} # 跟 ${var:-string} 作用一样
${var:?string} # 若变量var不为空,则维持原值,若为空,则把string输出到标准错误中,并退出脚本。可以用来检查是否给变量赋值

shell function 如何返回字符串

[[FunctionCase]] shell函数只能返回整数值,如果想让函数返回字符串,一般有两种方法

  1. 将返回值赋值给一个字符串变量

  2. 直接输出返回值,在函数调用处为变量赋值

示例:

# 将返回值赋值给一个字符串变量
get_system_version(){
	VERSTION=`cat /etc/os-release | grep NAME |head -n 1 | awk -F '"' '{print $2}'`
	
}

# 直接输出返回值,在函数调用处为变量赋值
get_system_version(){
	echo `cat /etc/os-release | grep NAME |head -n 1 | awk -F '"' '{print $2}'`
}
version=`get_system_version`

shell $# $ 是什么意思*

$# 本程序的参数个数 $* 本程序的所有参数

如何使用 shell 实现一个爬虫,你描述下整个过程,会用到哪些命令?

redis 哨兵机制主从是如何切换的?

网络 mtu 是什么?他发生在那一层,如果 2 个设备 mtu 值不同,以谁为准,那么 2 个设备是如何协商的?详细协商流程是?

MTU(Maximum Transmission Unit,最大传输单元)。指在网络中,联网设备可以接收的最大数据包的值。超过该限制的包将被分成较小的碎片进行传输,这个过程称为[[分片]]。分片的数据包在到达目的地之后会重新组装。 MTU以字节数为单位,一个“字节”等于8位信息,即8个1或0。1500字节是MTU最大值。 MTU发生在IP层(OSI模型的第三层,网络层)

如果两个设备MTU值不同,则以MTU值小的为准。 当需要通讯的两台设备在TCP握手阶段,会各自发送自己支持的MSS(Maximum Segment Size,最大报文段长度)。如果在中间链接MTU变小,较小MTU接口会丢弃报文,并向发送源服务器发送一条type=3,code=4,MTU=XXX的ICMP消息,告诉发送源,自己能支持的MTU大小是多少,后续报文按该大小进行发送。

0.0.0.0 255.255.255.255 这 2 个 ip 地址是什么意思?他们的适用场景是?

0.0.0.0 一般表示为还未分配 IP的主机;或表示一个网络范围(即所有IP)。一般用在表示一个网络范围上 255.255.255.255是一个广播地址(覆盖整个网络范围)。一般用于向整个2层网络发送广播信息。

VIP 如何漂移的?他的底层原理是

VIP是一个不与特定计算机或网络接口相连的真实IP地址。数据包会被发送到这个VIP,但所有数据还是经过真实的网络接口。VIP大部分用于连接冗余,一个VIP地址可以在一台计算机或接口发生故障时,交由另外一个可选计算机或接口响应连接。 VIP的原理:VIP的实现主要是靠TCP/IP的[[ARP协议]] 和心跳检测机制。因为IP地址只是一个逻辑地址,在以太网中MAC地址才是真正用来进行数据传输的物理地址。VIP的MAC地址则会跟主负载的真实IP拥有同一个MAC地址,每次连接VIP时就会向对应的MAC地址发送数据,同时在多个真实IP之间会有一个健康检查机制,类似心跳包,当在一定时间内主IP没有给其它备IP发送心跳包,或者备IP在一定时间没收到主IP的心跳包,就会向网络中发一个ARP广播,告诉路由器VIP对应的MAC变成了备IP的MAC,让路由器更新APR缓存表,这样所有发送到VIP的数据就会发送到更新的MAC地址。

tunnel VPN 翻墙他实现的原理是,他是怎么绕过防火墙的,数据包传输流程,他在那一层欺骗了防火墙等

nginx 相关 正向 /反向代理是什么意思?他们区别是?

正向代理:工作原理类似一个跳板,比如,因为某些原因,当我无法访问google这个服务时,先连上一台能连接到google的代理服务器,由这个代理服务器去请求我想要访问的信息,然后返回给我。

反向代理:当客户访问一个网站时,实际访问的站点可能只是一个入口,用户访问的资源实际由这个服务器后端的其它服务器来提供,反向代理根据客户端请求的信息判断由后端哪台服务器处理,并将处理后的内容返回给客户端。

代理服务器就是位于发起请求的客户端与原始服务器之间的一台跳板服务器,正向代理可以隐藏客户端,或者由客户端来突破一些封锁,访问原本被限制的内容。反向代理可以 隐藏原始服务器,在后端有多台服务器支持响应,提高服务器的负载能力。

一般架构 nginx 集群 --反向代理--> tomcat ,为什么不能反过来部署呢?高并发 /动静分离等,这些我程序也可以做

都说 nginx 轻量级,比如对比 tomcat ,epoll 是操作系统机制,与 nginx 无关,我自己开放也可以调用,内存占用小 /启动快这不是特点,模块化这也不是特点,我自己开发程序也可以实现。。。

都说 docker 轻量级,他轻量在哪里,从技术角度分析,咱们都是搞技术,不需要从产品角度分析他为什么轻量?

docker volume bind mount 他们区别是什么? 如何构建最小的镜像,说说你的思路?

docker -p/P 他的实现原理是什么?

Infrastructure as code 思想,你是怎么理解的?

资产管理 /配置管理他们分别是?区别是?

持续部署 /持续交付他们是?区别是?

ci/cd 带来的好处是?蓝绿发布是?他的优缺点?

jenkins 如何通过原生方式备份配置 /job 等(不通过 jenkins 提供导入导出 /已经拷贝整个目录)

pipeline 是什么,他有什么优势?

jenkins 我要在其他环境重放 job 如何实现?

shift-left 你是怎么理解的?

git 相关 svn/git 分别是?他们有什么区别?

index/local/remote/workspace 他们是?比如 git add xxx 他发生了什么?

都说 git 管理 /切分支轻量,他们轻量在哪里,具体原理是?

git rebase xxx 发送冲突,他的根本原因是?不要说具体场景 git fetch/git pull 他们区别是?

你本是开发使用一套分支流程说?为什么要这么做?他的优缺点说?

kafka 相关 broker partition segment 他们是?他们关系是

kafka 如何保持数据可靠? ISR 是什么?他的工作机制是?

python 相关 GIL 是什么,为什么需要它?

python decoration(装饰器) 他的场景是?他的原理是?

如果要你实现一个 sidecar ,说说你的思路?

线下一个服务响应很慢,你如何排查,排查流程是?

最后更新于