运维工程师面试题一

概述

运维工程师面试题一

运维初试

1、以下为一个正则表达式,请问它的含义是?

^Sun[0-9][A-Z]x$

以Sum开头,x结尾,中间为0-9或A-Z

2、data目录下有多层文件

要求:修改data目录及其所有子文件的owner为 test,group为 testgroup

chown -R test:testgroup data

3、当前路径下存在一个log目录,log目录下至少有4个层级的文件表示,每个层级的文件有不同类别

要求:查找log目录下第二层最近5天内修改过的目录

find log -maxdepth 1 -type d -mtime -5

4、在机器上eth0网卡上抓来自192.168.9.73的包,目标的端口是10001,输出时打印包头和包的内容,不要转换地址。

1
2
3
4
5
-i eth0:指定监听的网络接口是eth0。
src 192.168.9.73:指定只捕获源IP地址为192.168.9.73的数据包。
dst port 10001:指定只捕获目的端口为10001的数据包。
-nn:禁止tcpdump对地址(IP地址和端口号)进行名称解析。
-X:以十六进制和ASCII码同时显示数据包的内容,既包括包头也包括数据内容。

tcpdump -i eth0 src 192.168.9.73 and dst port 10001 -nn -X

5、使用crontab设置如下定时任务,并将stdin和stderr重定向到/dev/null:

每天晚上22:15 执行/usr/bin/下的update.sh

每隔五分钟执行/usr/bin/的update.sh

1
2
15 22 * * * /usr/bin/update.sh >/dev/null 2>&1
*/5 * * * * /usr/bin/update.sh >/dev/null 2>&1

6、file文件的组外成员的权限为只读;所有者有全部权限;组内的权限为读与写,则该文件的权限为?

rwx-rw-r

7、mysql 以test库为例,写出备份和恢复

mysqldump -u user -p test>test.bck.sql
mysqldump -u user -p test<test.bck.sql

8、使用docker命令,以后台方式启动一个nginx容器,要求

版本是:latest

可以通过host 80端口访问
可以通过host 的/data/nginx目录访问nginx html目录

docker run -itd --name nginx -p 80:80 -v /data/nginx:/usr/share/nginx/html nginx:latest

9、K8S中使用deployment,部署3个实例的nginx,要求:

版本是latest
可以通过主机host 8080端口访问nginx服务
也可以通过主机域名80端口访问nginx服务
可以通过host的/data/nginx 目前访问nginx html目录。

10、脚步test.sh里内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# Name:test.sh
a="Good Luck"
b='$a'
function test()
{
local a=$1
b=$2;shift
export c=$(eval echo $3)
}
test 10 20 30 $b
echo $a ${b} $c

解读代码含义并说出结果

a=”Good Luck”
b=’$a’ $a为字符串
执行test 10 20 30 $b的时候$b=’$a’ –>test 10 20 30 ‘$a’
test() 内部
local a=$1为局部变量,不会改变外部的a=”Good Luck”
b=$2 b=20,左移一位,删除第一个参数10 test 20 30 ‘$a’
export定义环境变量,c=$(eval echo $3) eval 会将后面的代码扫描两次,第一次结果为$a,局部变量a=10,第二次扫描为10,c=10

结果: Good Luck 20 10

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@jafardu ~]# bash -x aaa.sh 
+ a='Good Luck'
+ b='$a'
+ test 10 20 30 '$a'
+ local a=10
+ b=20
+ shift
++ eval echo '$a'
+++ echo 10
+ export c=10
+ c=10
+ echo Good Luck 20 10
Good Luck 20 10

11、有event表和work表分别如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> select * from event limit 3;
+------------+------+------+-------+
| event_time | type | uid | score |
+------------+------+------+-------+
| 2013-04-01 | 1 | 2344 | 34 |
| 2013-04-02 | 2 | 2122 | 21 |
| 2013-04-03 | 3 | 6744 | 9 |
+------------+------+------+-------+
3 rows in set (0.00 sec)

mysql> select * from work limit 3;
+------------+-----------+------+
| test_time | test_type | uid |
+------------+-----------+------+
| 2013-04-01 | 12 | 2344 |
| 2014-04-01 | 13 | 2122 |
| 2014-04-02 | 14 | 6744 |
+------------+-----------+------+
3 rows in set (0.00 sec)

其中:

event表里存放事件发生时间, 发生的种类,user的id,以及user的分数

work表里存放测试时间,测试类型的编号,user的id

要求:

在event表里找出4月4号到4月29号的user,统计他们发生event的次数以及总的分数(score),和socre的最大值,以及这个user在work表里这段时间参加test为11,12的次数

分析:

  1. 连接两个表:我们将通过uid字段连接event表和work表,以便能够访问与同一用户相关的所有信息。
  2. 限制日期范围:使用WHERE子句限定event表中event_time字段的日期在4月4号到4月29号之间。
  3. 筛选特定测试类型:在连接的表中筛选work表的test_type为11或12的记录。
  4. 分组和统计:按照uid分组,以便为每个用户计算事件发生的次数、总分数、最大分数,以及特定测试类型的参加次数。
1
2
3
4
5
6
7
8
9
10
11
12
13
-- 答案 
select
e.uid,
COUNT(e.uid) AS event_count,
SUM(e.score) AS total_score,
MAX(e.score) AS max_score,
COUNT(w.uid) AS work_count
from event e
LEFT JOIN
work w ON e.uid = w.uid AND w.test_time BETWEEN '2013-04-01' AND '2013-04-29' AND w.test_type IN (11,12)
where e.event_time BETWEEN '2013-04-01' AND '2013-04-29'
GROUP BY
e.uid;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-- 验证  
创建库中的数据
-- 创建student数据库
CREATE DATABASE student;

-- 使用student数据库
USE student;

-- 创建xx表,定义uid,等信息
create table event (
event_time DATE,
type INT,
uid INT,
score INT
);


-- 创建xx表,定义uid,等信息
create table work (
test_time DATE,
test_type INT,
uid INT
);

insert into event VALUES
('2013-04-01',1,2344,34),
('2013-04-02',2,2122,21),
('2013-04-03',3,6744,9);

insert into work values
('2013-04-01',12,2344),
('2014-04-01',13,2122),
('2014-04-02',14,6744);

12、有两个文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
a.txt:


251235308 3064

33616578 8972

910088709 1243

343163213 1182


b.txt:


33616578 HN 189

910088709 GD 80

343163213 BJ 253

610112757 GD 90


使用awk处理两个文件得到以下输出:


251235308 3064 - -

33616578 8972 HN 189

910088709 1243 GD 80

343163213 1182 BJ 253

610112757 - GD 90

awk 'NR==FNR{b[$1]=$2 FS $3; next} {print $1, $2, (b[$1] ? b[$1] : "- -")} END{for (i in b) if (!a[i]) print i, "-", b[i]}' b.txt a.txt

13、Server上运行进程 gamesvrd,请制定一个监控方案(需脚本实现)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# 答案
# 进程名称
process="gamesvrd"

# 检查进程是否运行
if pgrep -x "$process" >/dev/null
then
echo "$process is running"
else
echo "$process stopped"
# 在这里添加启动进程的命令
# /path/to/$process &
echo "$process restarted"
fi

14、使用python,写一个方法获取URL中的查询字符串的参数,如:http://baidu.com/?a=c&b=d&r=45,返回{a:"c",b:"d",r:45}

1
2
3
4
5
6
7
8
9
10
11
# python -m pip install --upgrade pip
# pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# pip3 install requests selenium pyquery pymysql pymongo redis flask django

>>> from urllib.parse import urlparse,parse_qs
>>> url=urlparse('http://baidu.com/?a=c&b=d&r=45')
>>> params = parse_qs(url.query)
>>> result = {k: v[0] for k,v in params.items()}
>>> print(result)
{'a': 'c', 'b': 'd', 'r': '45'}
>>>

15、日常工作中遇到如下场景

日志里出现unable to attach to shared memory,可能的原因是什么,如何解决?

如何判断程序是否存在内存泄露?

rm删除文件后空间没有释放,可能的原因和解决方法

某台服务器出现CPU 100%,你如何分析?

一后端服务,发现在与用户通信时,偶概率会出现可以收到用户侧的数据包,但是发送给用户的数据包用户收不到的情况,请简述排障思路。

作者

Galen Du

发布于

2024-03-15

更新于

2025-02-17

许可协议

评论