learn-tech/专栏/重学操作系统-完/12(1)加餐练习题详解(二).md
2024-10-16 11:00:45 +08:00

157 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

因收到Google相关通知网站将会择期关闭。相关通知内容
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。通过管道将这个结果传递给了cat。cat是 concatenate 的缩写,意思是把文件粘在一起。
当cat用>重定向输出到一个管道文件时如果没有其他进程从管道文件中读取内容cat会阻塞。
当cat用<读取一个管道内容时如果管道中没有输入也会阻塞
从这个角度来看总共有 3 次重定向
将-也就是输入流的内容和pipe1内容合并重定向到pipe2
将pipe2内容重定向到cat
将cat的内容重定向到pipe1
仔细观察下路径pipe1->pipe2->pipe1构成了一个循环。 这样导致管道pipe1管道pipe2中总是有数据没有数据的时间太短。于是就构成了一个无限循环。我们打开执行这个程序后可以用htop查看当前的 CPU 使用情况,会发现 CPU 占用率很高。
08 | 用户和权限管理指令: 请简述 Linux 权限划分的原则?
【问题】 如果一个目录是只读权限,那么这个目录下面的文件还可写吗?
【解析】 这类问题,你一定要去尝试,观察现象再得到结果。
你可以看到上图中foo 目录不可读了下面的foo/bar文件还可以写。 即便它不可写了下面的foo/bar文件还是可以写。
但是想要创建新文件就会出现报错,因为创建新文件也需要改目录文件。这个例子说明 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 的一个解答:
在这里我再多说两句,程序员成长最需要的是学习时间,如果在这前面加一个形容词,那就是大量的学习时间;而程序员最需要掌握的技能就是搜索和学习知识的能力。如果你看到今天的这篇内容,说明已经学完了《重学操作系统》专栏两个模块的知识,希望你可以坚持下去!
11 | 高级技巧之日志分析:利用 Linux 指令分析 Web 日志
【问题 1 】 根据今天的 access_log 分析出有哪些终端访问了这个网站,并给出分组统计结果。
【解析】access_log中有Debian和Ubuntu等等。我们可以利用下面的指令看到第 12 列是终端,如下图所示:
我们还可以使用sort和uniq查看有哪些终端如下图所示
最后需要写一个脚本,进行统计:
cat nginx_logs.txt |\
awk '{tms[$12]++;next}END{for (t in tms) print t, tms[t]}'
结果如下:
【问题 2】 根据今天的 access_log 分析出访问量 Top 前三的网页。
如果不需要 Substring 等复杂的处理也可以使用sort和uniq的组合。如下图所示
12 | 高级技巧之集群部署:利用 Linux 指令同时在多台机器部署程序
【问题】~/.bashrc ~/.bash_profile, ~/.profile 和 /etc/profile 的区别是什么?
【解析】 执行一个 shell 的时候分成login shell和non-login shell。顾名思义我们使用了sudosu切换到某个用户身份执行 shell也就是login shell。还有 ssh 远程执行指令也是 login shell也就是伴随登录的意思——login shell 会触发很多文件执行,路径如下:
如果以当前用户身份正常执行一个 shell比如说./a.sh就是一个non-login的模式。 这时候不会触发上述的完整逻辑。
另外shell还有另一种分法就是interactive和non-interactive。interactive 是交互式的意思当用户打开一个终端命令行工具后会进入一个输入命令得到结果的交互界面这个时候就是interactive shell。
baserc文件通常只在interactive模式下才会执行这是因为~/.bashrc文件中通常有这样的语句如下图所示
这个语句通过$-看到当前shell的执行环境如下图所示
带 i 字符的就是interactive没有带i字符就不是。
因此, 如果你需要通过 ssh 远程 shell 执行一个文件,你就不是在 interactive 模式下bashrc 不会触发。但是因为登录的原因login shell 都会触发,也就是说 profile 文件依然会执行。
总结
这个模块我们学习了 Linux 指令。我带大家入了个门,也和你一起感受了一次 Linux 指令的博大精深。Linux 虽然没有上下五千年的历史但每次使用依然让我感受到了它浓郁的历史气息悠久的文化传承自由的创造精神。希望这块知识可以陪伴大家鼓励你成为优秀的程序员。虽然我们已经学了几十个指令但还是沧海一粟。后续就需要你多查资料多用man手册继续深造了。
好的Linux 指令部分就告一段落。下一节课,我们将开启操作系统核心知识学习,请和我一起来学习“模块三:操作系统基础知识”吧。