为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。
本份面试集锦涵盖了
- 174 道运维工程师面试题
- 128道k8s面试题
- 108道shell脚本面试题
- 200道Linux面试题
- 51道docker面试题
- 35道Jenkis面试题
- 78道MongoDB面试题
- 17道ansible面试题
- 60道dubbo面试题
- 53道kafka面试
- 18道mysql面试题
- 40道nginx面试题
- 77道redis面试题
- 28道zookeeper
总计 1000+ 道面试题, 内容 又全含金量又高
- 174道运维工程师面试题
1、什么是运维?
2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
3、现在给你三百台服务器,你怎么对他们进行管理?
4、简述raid0 raid1raid5二种工作模式的工作原理及特点
5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
\a 警告音
\b 删除前一个字符
\f 换页符
\r 回车,回到本行开头
\n 换行,到下一行开头
\t 一个制表符
\v 竖直制表符
echo中 使用转移字符 需要 -e 选项使能转移字符
$ echo -e “User name: $USER\tHome Directory: $HOME\n”
User name: ywy Home Directory: /home/wyw
######字符串#####
var=shell
$printf “%s\n” $var
shell
$printf “%1s\n” $var #指定参数长度小于实际长度,按实际长度打印
shell
$printf “%1.3s\n” $var #小数点后指示打印的字符串长度
she
$printf “%1.6s\n” $var #小数点后指示打印的字符串长度
shell
$printf “%3.6s\n” $var #小数点后指示打印的字符串长度
shell
$printf “%6.6s\n” $var #指定长度大于实际长度,左边补空格
shell
$printf “%10.6s\n” $var #指定长度大于实际长度,左边补空格
shell #左边补了5个空格
$printf “%10.2s\n” $var #指定长度大于实际长度,左边补空格
sh #左边补了5个空格,同时只打印前2个字符
####小数######
$varr=123.45678
$printf “%5.1f\n” $varr #打印总长度5(包含小数点)保留小数点后1位数字
1123.5
$printf “%6.2f\n” $varr #
1123.46
$printf “%7.3f\n” $varr #
123.457
$printf “%9.3f\n” $varr #打印长度9,保留小数点后3位,只有7位长度,左侧空格
123.457
$printf “%10.3f\n” $varr #打印长度10,保留小数点后3位,只有7位长度,左侧空格
123.457
### 变量引用 双引号 “$变量名” 将变量整体化
LIST=“one two three”
for var in KaTeX parse error: Expected 'EOF', got '#' at position 8: LIST #̲ 将变量的值分成3个参数传递给…var"
done
one
two
three
for var in “KaTeX parse error: Expected 'EOF', got '#' at position 9: LIST" #̲ 将变量的值作为一个整体传递给…var”
done
one
### export 变量名=变量值 声明定义全局变量 多bash环境可用
### readonly 变量名=变量值 声明只读变量
### unset 变量名 删除 export 定义的全局变量,不能删除 readonly 只读变量
### 检查变量是否存在 变量名? 不存在提示语 或 ${变量名:? 不存在提示语}
JAVA_HOME=/usr/local/jdk
export JAVA_HOME
echo ${JAVA_HOME:? Error variable is not defined}
/usr/local/jdk
unset JAVA_HOME
echo ${JAVA_HOME:? Error variable is not defined}
-bash JAVA_HOME: Error variable is not defined
还有一种更简单的检查变量是否存在的方法 使用 if语句来判断
### 回调 历史命令
回调 历史命令
history
会显示之前输入过的命令
id1 命令
…
idn 命令
!! 输入两个! 会执行就一条指令
!+id号 会执行历史命令中对应id号的命令
!+历史命令开头的字符 会执行历史命令中有已字符开头的命令
### shell中的扩展 展开 繁殖
大括号扩展 波浪号扩展 参数和变量扩展 命令替换 算术扩展 进程替换 单词拆分 和 文件名扩展
#### 大括号扩展 前缀字符{字符1,字符2,…,字符n}后缀字符
echo a{b,c,d}e
abe ace ade
echo {a…z} # 按字母表顺序显示 a~z字母
a b c d … x y z
echo {0…10} # 显示0~10的数字
0 1 2 3 … 9 10
echo {6…-4} # 显示6~-4的数字
6 5 4 3 … 0 -1 -2 -3 -4
echo {g…a} # 显示g~a的字母 反向
g f e d c b a
echo {1…3}{a…c}
1a 1b 1c 2a 2b 2c 3a 3b 3c
嵌套
echo a{{b,c}1,{d,e}3,f}h
ab1h ac1h ad3h ae3h afh
大括号扩展 繁殖命令
在 当前目录下创建三个文件夹 son1 son2 son3
mkdir ./{son1,son2,son3}
bash 4.0 新功能 {起点…终点…步长}
echo {0…10…2}
0 2 4 6 8 10
echo {10…3…-2}
10 8 6 4 2
echo {a…k…2}
a c e g i k
echo {0001…11…5} # 指定形式
0001 0006 0011
#### ~ 波浪号 指代用户主目录
cd ~
pwd
/home/wyw
cd ~wyw
pwd
/home/wyw
~+ 指代 shell变量 PWD的值
echo ~+
/tmp
echo $PWD
/tmp
~- 指代 shell变量 LODPWD 的值
echo ~1
/home/wyw
echo $LODPWD
/home/wyw
#### 文件名扩展
- 匹配任意字符,包括空格,多个字符,单个字符
? 匹配任意单个字符
[xyx] 匹配阔靠内的任意单个字符
ls ./*.txt
列出 当前目录下 所有以.txt结尾的文件
ls ./[abc]*.cfg
列出 当前目录下 以a或b或c开头,以.cfg结尾的文件
ls ./image?.jpg
显示所有 image1.jpg\image2.jpg…\image9.jpg 文件
ls ./image1[0-9]*.jpg
列出 以 image10 \ image11 …\image19开头,以.jpg结尾的文件
#### 命令别名
alias 别名=‘完整命令’
例如:
alias ll=‘ls -l’
是 cp\mv\rm等命令交互式地执行并解释执行了哪些操作
alias cp=‘cp -iv’
alias mv=‘mv -iv’
alias rm=‘rm -iv’
查看磁盘使用情况
alias dus=‘df -h’
查看所有定义的别名命令
alias
不带参数
### 第三章 常用 shell 命令
#### ls 列出文件名和目录
ls
ls -l
-l 显示全部文件信息:
第一个字符:-,普通文件 d,文件夹 s,套接字文件 l,链接文件
后面9个字符: 文件权限,rwx 读r 写w 执行x 分别为 所有者、用户组、其他用户的权限
ls -lh 文件大小显示为KB MB GB 单位
ls -ls 安装文件大小顺序列出文件和文件夹
ls -a 显示所有文件
生成文件名变量
prototxt_file_name=KaTeX parse error: Expected 'EOF', got '#' at position 17: …ls *.prototxt) #̲.prototxt文件数量 c…(grep -c “.prototxt” $prototxt_file_name | wc)
#### cat 显示文件 more less head tail file
cat 查看文件内容 连接文件 创建一个或多个文件 重定向输出到终端或文件
查看文件内容 cat 正序显示 tat 倒序显示文件内容
cat wyw.txt / cat -n wyw.txt 显示行号 / cat -b wyw.txt 显示非空白行行号
cat -e wyw.txt 会在每行末尾 多显示 $ 符号 (多行内容转换成一行时很有用)
#使用命令行输入创建文件 并连接多个文件
cat >test1
hello!
cat >test2
world!
cat test1 test2 > test3
#显示 test3
cat test3
hello!
world!
more 分屏显示文件内容
more /etc/inittab / more -10 /etc/inittab 指定一次显示的行号
less 查看文件速度快 可快速查找关键字
less /etc/inittab
输入 /关键字 然后回车 向后搜索关键字
?关键字 然后回车 向前搜索关键字
Ctrl+B 向回翻一个窗口的内容 Ctrl+F 向后翻一个窗口的内容
显示 文件 头 head 显示 文件尾 tail
head /etc/inittab / head -10 /etc/inittab 显示开头前10行
tail /etc/inittab / tail -20 /etc/inittab 显示末尾倒数20行
file 文件名 显示文件类型
file /etc/inittab
/etc/inittab: ASCII English text
file -i /etc/inittab
#### wc 查看文件统计信息
wc 文件名
行数 单词数 字节数 文件名
wc -l 文件名 只统计行数
wc -w 文件名 只统计单词数
wc -c 文件名 只统计字节数
wc -L 文件名 统计文件中最长行的长度
#### find 查找文件/目录
查找文件
find ./wanyouwen/.txt # 查找 ./wanyouwen 目录下的 txt文件
find ./wanyouwen -type f -name ".txt"
find ./wanyouwen -type f -perm 0777 查找权限是777的文件
find ./wanyouwen -type f ! -perm 777 查找权限不是777的文件
find ./wanyouwen -type f -perm /a+x 查找可执行文件
find ./wanyouwen -type f empty 查找空文件
查找文件夹
find ./ -type d -name wanyouwn
find ./wanyouwen -type d empty 查找空文件夹(目录)
#### touch 创建文件 mkdir 创建文件夹 cp 复制文件/文件夹 ln -s 创建符号链接文件 mv移动/重命名文件/目录
创建文件
touch 文件1 文件2 文件3
touch -c 已有的文件名 只更新 文件时间戳
touch -m 已有的文件名 只更新 文件的修改时间
创建文件夹
mkdir 文件名1
mkdir -p 文件名2/文件夹3 递归创建 带有父目录
复制文件/文件夹
cp 文件1 ./xxx/ 复制
创建符号链接文件
ln -s 原地址 目标地址 # 在目标地址创建一个 原地址的快捷链接
移动/重命名文件/目录
mv 原地址文件/目录 新地址文件/目录
删除文件/目录
rm 文件名
rm -rf 文件夹
rm *.txt
rm *[0-9].txt
#### 管理文件或目录权限
显示权限
ls -l
修改权限
chmod 777 文件 r(4) w(2) x(1)
chmod a+r 文件
chmod a+w 文件
chmod a+x 文件
chmod o+r 文件
chmod o+w 文件
chmod o+x 文件
chmod u+r 文件
chmod u+w 文件
chmod u+x 文件
chmod g+r 文件
chmod g+w 文件
chmod g+x 文件
修改所有者 和 用户组
chown
chgrp
设置(用户、组)权限位
setuid
setgid
#### 文本处理
##### 文本排序 sort
$ cat tep.txt
abc
def
ghi
def
$ sort tep.txt # 将文件内容按字母顺序排序
abc
def
def
ghi
$ sort -u tep.txt # 排序 并去除重复的行
abc
def
ghi
$ cat digit.txt
10
30
20
100
$ sort -n digit.txt # 按数字大小排序
10
20
30
100
$ sort -n -r digit.txt # 按数字大小 倒序 排序
100
30
20
10
多列数字排序
$ cat dig.txt
abc,30
def,10
ghi,20
def,50
$ sort dig.txt # 默认按每行的第一列进行排序
abc,30
def,10
def,50
ghi,20
$ sort -t ‘,’ -k2n,2 dig.txt # 按第二列 数字大小顺序排序 -t 指定分隔符 -k 指定列数
def,10
ghi,20
abc,30
def,50
$ sort -t ‘,’ -k2nr,2 dig.txt # 按第二列 数字大小倒序排序 -t 指定分隔符 -k 指定列数 r倒序
def,50
abc,30
ghi,20
def,10
##### 文本去重 uniq (unique) 独一无二
$ cat tep.txt
aaa
aaa
bbb
ccc
ccc
$ uniq tep.txt # 去除重复行
aaa
bbb
ccc
$ uniq -c tep.txt # 记录每行出现次数
2 aaa
1 bbb
2 ccc
$ uniq -d tep.txt # 只显示有重复的行,只显示一次
aaa
ccc
$ uniq -D tep.txt # 只显示有重复的行,显示所有
aaa
aaa
ccc
ccc
$ uniq -u tep.txt # 只显示不重复的行
bbb
$ uniq -w 3 tep.txt # 限定每行的前3个字符来比较每行是否重复
$ uniq -f 1 tep.txt # 跳过每行前1个字符来比较每行是否重复
##### 替换或删除字符 tr
大小写转换
$ echo linuxShell | tr [:lower:] [:upper:]
LINUXSHELL
$ echo linuxShell | tr a-z A-Z # 功能同上
LINUXSHELL
替换空格
$ echo “Hello world” | tr -s [:space:] ‘\t’
Hello world # 空格 换成 制表符 -s 多个连续的空格算一个
删除 字符 -d 选项
$ echo “Hello world” | tr -d a-z # 删除全部小写字母
$ echo “Hello world 12345” | tr -d [:digit:] # 删除全部数字
$ echo “Hello world 12345” | tr -cd [:digit:] # 删除全部数字以外的字符
##### 字符串查找 grep 常用
grep 关键字 目标文件/目标文件夹/字符串
grep -r 关键字 目标文件夹 # 递归查找 或者 grep -R 关键字 目标文件夹
grep -c 关键字 目标文件/目标文件夹/字符串 # 查找出现的次数
grep -n 关键字 目标文件/目标文件夹/字符串 # 显示行号和对应出现的位置
##### 文件比较 diff
diff 文件1 文件2 # 比较两个文件的差异
diff -yw 文件1 文件2 # 并排显示两个文件的差异
#### 其他常用命令
hostname # 查看主机名
hostname 新主机名 # 临时修改主机名,下次重启恢复原主机名
who/w # 列出系统登录用户
who -b # 显示系统启动时间
who -l # 显示系统登录进程时间
who -m # 只显示与当前用户相关的信息
uptime # 查看系统运行时间
uname # 查看系统信息,内核名
uname -r # 内核版本信息
uname -p # 系统硬件CPU类型
uname -i # 硬件平台信息
uname -n # 打印主机名
uname -a # 显示上述所有信息
获取日期信息 data
year = $(data +%Y)
2019
year = $(data +%y)
19
mouth = $(data +%m)
08
mouth = $(data +%d)
10
$(data +%H) 小时
$(data +%M) 分钟
$(data +%S) 秒
week = ‘data +%a’ # 星期几
### 第四章 shell命令进阶
#### 文档处理 和 归档 paste合并文件 dd备份和拷贝文件
paste 合并多个文件的相应行到同一行
$ cat t.txt
1
2
3
$ cat d.txt
a
b
c
$ paste t.txt d.txt
1 a
2 b
3 c
$ paste -d’|’ t.txt d.txt # 指定合并时的分隔符
1|a
2|b
3|c
$ paste -d’:,’ t.txt d.txt y.txt # 合并多个文件时指定多个分隔符
文档复制 dd
dd if=输入文件的路径(默认标准输入) of=输出文件的路径(默认标准输出)
实例:
dd if=/dev/sda of=/dev/sdb #将磁盘/dev/sda 数据复制到 磁盘/dev/sdb
dd if=/dev/dvd of=dvd.iso #将磁盘/dev/dvd 数据复制变为一个iso文件
dd if=/dev/zero of=/dev/sda2 #擦除/dev/sda2分区的数据(格式化)
压缩和归档文件 gzip bzip2
解压缩文件 gunzip bunzip2
打包/解包文件 tar -czvf xxx(打包) tar -xzvf xxx (解包)
#### 监测和管理磁盘
挂载mount 和 卸载umount 存储介质 到 文件系统某节点
df 报告文件系统磁盘空间利用率
df -a # 显示所有文件系统信息
df -h # 以GB MB 单位来显示文件大小 和 使用率等信息
df -t # 显示文件系统类型
df -m # 以为块大小单位显示文件系统信息
du 评估文件空间利用率
du -h
du -sh
du -h --time # 显示大小和修改时间
#### 后台执行命令 cron 大管家 at大将军执行者 &任务发布者
cron 大管家
cron 是定时执行计划任务的守护进程,cron进程会从/etc/init.d 中自动启动。
cron进程会在目录 /var/spool/cron/crontabs/ 下搜索定时计划任务文件,并将这些定时计划任务载入内存。
cron进程还会读取 /etc/crontab 以及 /etc/cron.d 下的内容
cron进程会每分钟唤醒一次,审查所有存储的定时任务,是否按规定执行(大管家)
crontab -l
60 6 * * 0 /home/xxx/backup
每周日(0)的6点30分 指向该任务;前5个字段分别为 分钟 小时 日期 月份 星期; * 号表示任意,小时为24小时制。
at大将军执行者 在指定时间执行命令
at noon 在中午12点前 midnight 凌晨12点 teatime下午4点 …
&将任务放在后台执行 指令 &
nohup 运行一个对挂起免疫的命令
## 第二篇 shell 脚本编程
### 5. shell 编程基础
#!/bin/bash # 第一行,指示行,指定解释器,若没有,则默认使用 /bin/sh作为解释器
单行注释
xxxxx代码
多行注释 1
:<<!
xxx 代码
xxxx
xxxxx
!
多行注释2
<<COMMENT
代码1
代码2
…
COMMENT
给脚本执行权限
chmod 777 xxx.sh
将脚本路径当如系统环境变量中可不加路径直接执行
export PATH=$PATH:/home/wanyouwen/shscrips
xxx.sh
变量进阶
定义变量
变量名=xxxx
使用变量
$变量名 或者 ${变量名}
字符串修改
FILENAME=linux_bash.txt
echo ${FILENAME%.} # 移除文件名后缀保留文件名 %.
linux_bash
echo ${FILENAME##.} # 移除文件名,保留后缀 ##.
txt
FILENAMEPATH=home/wanyouwen/linux_bash.txt
echo ${FILENAME%/} # 移除文件名保留目录路径 %/
home/wanyouwen/
echo ${FILENAME##/} # 移除目录路径保留文件名 ##/
linux_bash.txt
字符串长度
${#变量名} # 获取变量名指定的字符串长度
TEX=“123456789a”
${#TEX}
10
获取子字符串
#{变量名:起点:长度} 索引从0开始
${TEX:3:4}
4567
bash 脚本参数
./xxx.bash 参数1 参数2 参数3 参数4
param1=$1
param2=$2
param3=$3
param4=$4
declare 指定变量类型
declare -r var=1 # 设定只读变量 var 其值为1
var=2 # 只读变量不能被修改,会报错
declare -i 变量 # 指定变量为整数型变量
declare -a 变量 # 声明数组变量
declare -a linux={‘ubuntu’,‘redhat’}
简单数组定义
linux=()
赋值
linux[0]=‘ubuntu’
linux[1]=‘redhat’
获取数组变量元素
echo ${linux[@]} 或者 echo ${linux[]} # 索引编号 @/ 代表所有元素
ubuntu redhat
echo ${linux[0]}
ubuntu
echo ${linux} # 数组名指代第一个元素
ubuntu
#### shell 算数运算
id++ id-- 变量后递增和后递减
++id --id 变量前递增和前递减
- 单目 负号
= 单目 正号
! 逻辑反 ~按位取反
** 求幂
- 乘 /除 %取余 +加 -减
<< 按位左移 >> 按位右移
<= >= <> 小于等于 大于等于 不等于
& 按位与
^ 按位异或
| 按位或
&& 逻辑与
|| 逻辑或
expr?值1:值2
10 普通数字开头 十进制数
020 0数字开头为 八进制数
0x30 0x开头为 十六进制数
2#111 #前面指定进制数 2进制数
32#20 #32进制数
64 进制数
let base64=64#@_
64进制数,09;az;A~Z;@ _
@表示62
_表示63
### 6. shell 的条件执行
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
u','redhat'}
简单数组定义
linux=()
赋值
linux[0]='ubuntu'
linux[1]='redhat'
# 获取数组变量元素
echo ${linux[@]} 或者 echo ${linux[*]} # 索引编号 @/* 代表所有元素
>>> ubuntu redhat
echo ${linux[0]}
>>> ubuntu
echo ${linux} # 数组名指代第一个元素
>>> ubuntu
shell 算数运算
id++ id-- 变量后递增和后递减
++id --id 变量前递增和前递减
- 单目 负号
= 单目 正号
+
! 逻辑反 ~按位取反
** 求幂
* 乘 /除 %取余 +加 -减
<< 按位左移 >> 按位右移
<= >= <> 小于等于 大于等于 不等于
& 按位与
^ 按位异或
| 按位或
&& 逻辑与
|| 逻辑或
expr?值1:值2
10 普通数字开头 十进制数
020 0数字开头为 八进制数
0x30 0x开头为 十六进制数
2#111 #前面指定进制数 2进制数
32#20 #32进制数
##### 64 进制数
let base64=64#@_
64进制数,0~9;a~z;A~Z;@ _
@表示62
_表示63
6. shell 的条件执行
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!