12 (1)加餐 练习题详解(二)

今天我会带你把《模块二:Linux 指令》中涉及的课后练习题,逐一讲解,并给出每个课时练习题的解题思路和答案。

练习题详解

06 | 目录结构和文件管理指令:rm / -rf 指令的作用是?

【问题】 搜索文件系统中所有以包含 std字符串且以.h扩展名结尾的文件。

【解析】 这道题目比较简单,大家也比较活跃,我自己只写了一种方法,没想到留言中有挺多不错的方案,那我们一起来看下。

下面是我的方案,你学完模块二的内容后,应该知道查看全部文件需要sudo,以管理员身份:

sudo find / -name "*std*.h"

我在留言中看到有的同学用的是-iname,这样也是可以的,只是忽略了大小写。

也可以结合 grep 语句, 用管道实现,比如:

sudo find / -name "*.h" |grep std

07 | 进程、重定向和管道指令:xargs 指令的作用是?

【问题】 请问下面这段 Shell 程序的作用是什么?

mkfifo pipe1

mkfifo pipe2

echo -n run | cat - pipe1 > pipe2 &

cat < pipe2 > pipe1

【解析】 这个题目是我在网上看到的一个比较有趣的问题。

前 2 行代码创建了两个管道文件。

从第 3 行开始,代码变得复杂。echo -n run就是向输出流中写入一个run字符串(不带回车,所以用-n)。通过管道,将这个结果传递给了catcat是 concatenate 的缩写,意思是把文件粘在一起。

从这个角度来看,总共有 3 次重定向:

仔细观察下路径:pipe1->pipe2->pipe1,构成了一个循环。 这样导致管道pipe1管道pipe2中总是有数据(没有数据的时间太短)。于是,就构成了一个无限循环。我们打开执行这个程序后,可以用htop查看当前的 CPU 使用情况,会发现 CPU 占用率很高。

08 | 用户和权限管理指令: 请简述 Linux 权限划分的原则?

【问题】 如果一个目录是只读权限,那么这个目录下面的文件还可写吗?

【解析】 这类问题,你一定要去尝试,观察现象再得到结果。

Drawing 0.png

你可以看到上图中,foo 目录不可读了,下面的foo/bar文件还可以写。 即便它不可写了,下面的foo/bar文件还是可以写。

Drawing 1.png

但是想要创建新文件就会出现报错,因为创建新文件也需要改目录文件。这个例子说明 Linux 中的文件内容并没有存在目录中,目录中却有文件清单。

09 | Linux 中的网络指令:如何查看一个域名有哪些 NS 记录?

【问题】 如何查看正在 TIME_WAIT 状态的连接数量?

【解析】 注意,这里有个小坑,就是 netstat 会有两行表头,这两行可以用 tail 过滤掉,下面tail -n +3就是告诉你 tail 从第 3 行开始显示。-a代表显示所有的 socket。

netstat -a | tail -n +3  | wc -l

10 | 软件的安装: 编译安装和包管理器安装有什么优势和劣势?

【问题】 如果你在编译安装 MySQL 时,发现找不到libcrypt.so ,应该如何处理?

【解析】 遇到这类问题,首先应该去查资料。 比如查 StackOverflow,搜索关键词:libcrypt.so not found,或者带上自己的操作系统ubuntu。下图是关于 Stackoverflow 的一个解答:

Drawing 2.png

在这里我再多说两句,程序员成长最需要的是学习时间,如果在这前面加一个形容词,那就是大量的学习时间;而程序员最需要掌握的技能就是搜索和学习知识的能力。如果你看到今天的这篇内容,说明已经学完了《重学操作系统》专栏两个模块的知识,希望你可以坚持下去!

11 | 高级技巧之日志分析:利用 Linux 指令分析 Web 日志

【问题 1 】 根据今天的 access_log 分析出有哪些终端访问了这个网站,并给出分组统计结果。

【解析】access_log中有DebianUbuntu等等。我们可以利用下面的指令看到,第 12 列是终端,如下图所示:

Drawing 3.png

我们还可以使用sortuniq查看有哪些终端,如下图所示:

Drawing 4.png

最后需要写一个脚本,进行统计:

cat nginx_logs.txt |\

awk '{tms[$12]++;next}END{for (t in tms) print t, tms[t]}'

结果如下:

Drawing 5.png

【问题 2】 根据今天的 access_log 分析出访问量 Top 前三的网页。

如果不需要 Substring 等复杂的处理,也可以使用sortuniq的组合。如下图所示:

Drawing 6.png

12 | 高级技巧之集群部署:利用 Linux 指令同时在多台机器部署程序

【问题】~/.bashrc ~/.bash_profile, ~/.profile 和 /etc/profile 的区别是什么?

【解析】 执行一个 shell 的时候分成login shellnon-login shell。顾名思义我们使用了sudosu切换到某个用户身份执行 shell,也就是login shell。还有 ssh 远程执行指令也是 login shell,也就是伴随登录的意思——login shell 会触发很多文件执行,路径如下:

Lark20201019-104257.png

如果以当前用户身份正常执行一个 shell,比如说./a.sh,就是一个non-login的模式。 这时候不会触发上述的完整逻辑。

另外shell还有另一种分法,就是interactivenon-interactive。interactive 是交互式的意思,当用户打开一个终端命令行工具后,会进入一个输入命令得到结果的交互界面,这个时候,就是interactive shell

baserc文件通常只在interactive模式下才会执行,这是因为~/.bashrc文件中通常有这样的语句,如下图所示:

Drawing 7.png

这个语句通过$-看到当前shell的执行环境,如下图所示:

Drawing 8.png

带 i 字符的就是interactive,没有带i字符就不是。

因此, 如果你需要通过 ssh 远程 shell 执行一个文件,你就不是在 interactive 模式下,bashrc 不会触发。但是因为登录的原因,login shell 都会触发,也就是说 profile 文件依然会执行。

总结

这个模块我们学习了 Linux 指令。我带大家入了个门,也和你一起感受了一次 Linux 指令的博大精深。Linux 虽然没有上下五千年的历史,但每次使用,依然让我感受到了它浓郁的历史气息,悠久的文化传承,自由的创造精神。希望这块知识可以陪伴大家,鼓励你成为优秀的程序员。虽然我们已经学了几十个指令,但还是沧海一粟。后续就需要你多查资料,多用man手册,继续深造了。

好的,Linux 指令部分就告一段落。下一节课,我们将开启操作系统核心知识学习,请和我一起来学习“模块三:操作系统基础知识”吧。