CrabNote螃蟹笔记

Linux 命令面试题

本文《Linux 命令面试题》由小宇宙从原站整理搬运,详细讲解相关技术要点。

Linux的常用命令了解过哪些? 文件相关(mv mkdir cd ls) 进程相关(ps、top、kill、pkill) 权限相关(chmod chown useradd groupadd) 网络相关(netstat ip addr) 测试相关(测试网络连通性:ping 测试端口连通性:telnet) ps命令里都有哪些选项,ps展示哪些东西? ps命令展示内容: PID:进程ID。 PPID:父进程ID。 USER:进程所属用户。 %CPU:CPU占用率。 %MEM:内存占用率。 VSZ:虚拟内存大小。 RSS:物理内存大小。 TTY:终端设备。 STAT:进程状态。 START:进程启动时间。 TIME:进程累计CPU占用时间。 COMMAND:进程命令或可执行文件。 ps命令选项: a:显示与终端关联的所有进程(包括其他用户的进程,但不含会话首进程),注意它 并不等同于 e 。 u:显示用户相关的进程信息。 x:显示没有控制终端的进程。 e:显示系统中所有进程,等同于 选项。 f:显示详细的进程信息,包括进程的父进程、运行状态等。 l:显示长格式的进程信息,包括进程的PID、PPID、CPU占用率等。 r:显示正在运行的进程。 o:自定义输出格式。 top命令会展示什么东西,里面每一项都是呈现什么样的数据? 主要会展示: Load average(平均负载):显示系统在最近1分钟、5分钟和15分钟内的平均负载情况。 Tasks(任务):显示当前运行、睡眠、停止和僵尸状态的进程数量。 CPU usage(CPU使用情况):显示CPU的总体使用率以及每个CPU核心的使用率。 Memory usage(内存使用情况):显示物理内存的总量、已使用量、空闲量、缓冲区和缓存区的使用量。 Swap usage(交换空间使用情况):显示交换空间的总量、已使用量和剩余量。 进程列表:显示当前运行的进程列表,包括进程的PID、用户、CPU占用率、内存占用率、进程状态、启动时间和进程命令。 已知一个进程名,如何杀掉这个进程? 在 Linux 操作系统上,可以使用 命令来杀死进程,主要有下面几种方式: 方式一: + 两步走 先用 找到进程的 PID,再用 发送信号: 方式二:直接按进程名杀(推荐) 如果已经知道进程名,可以直接用 或 ,不用手动查 PID: 一般优先用 ( )让进程做一些清理工作再退出;只有在进程不响应或卡死时才使用 ( ),因为它会直接强制终止进程,来不及释放资源。 linux 如何查看进程状态? 可以通过 ps 命令或者 top 命令来查看进程的状态。 比如我想看 nginx 进程的状态,可以在 linux 输入这条命令: top 命令除了能看进程的状态,还能看到系统的信息,比如系统负载、内存、cpu 使用率等等 linux 如何查看线程状态? 在 ps 和 top 命令加一下参数,就能看到线程状态了: 如何查看网络连接情况? 可以通过 netstat 命令来查看网络连接的情况,比如下面,我通过 命令: 显示了服务器上的 tcp 连接状态,可以观察到每一个 tcp 连接的状态,以及四元组信息(源 IP 地址、目标 IP 地址、源端口、目标端口)。 怎么查看哪个端口被哪个进程占用? 可以通过 或者 命令查看,比如查看 80 端口。 lsof : netstat: 注意: 会匹配所有含 "80" 的字符(比如 、PID 里含 80 等), 过滤不准确 。推荐用 (冒号 + 空格)来精确定位端口字段,或者直接用 。 端口通不通用什么命令? 第一种方式:telnet:telnet命令用于建立与远程主机的Telnet连接,并可以使用telnet命令测试特定端口的可访问性。 示例: 用于测试指定IP地址上的指定端口是否可访问。如果能够建立连接,则表示端口通畅;如果连接失败或超时,则表示端口不可访问。 第二种方式:nc:nc命令(也称为netcat)是一个网络工具,可以用于创建各种类型的网络连接,包括测试端口的可访问性。 示例: 用于测试指定IP地址上的指定端口是否可访问。如果能够成功连接,则表示端口通畅;如果连接失败或拒绝,则表示端口不可访问。 top 命令查看是多少个 CPU 核心? 执行 top 命令之后,按数字 1,就能显示 CPU 有多少个核心了。 修改文件权限用什么命令? 用 chmod 命令,可以修改文件或目录的权限。 以下是几个使用chmod命令修改文件权限的例子: 将文件(例如file.txt)设置为只读权限: 将文件设置为所有者可读写权限,其他用户只能读取权限: 将文件设置为所有者可读写执行权限,所属组用户可读执行权限,其他用户只能读取权限: 将目录设置为所有者可读写执行权限,所属组用户可读执行权限,其他用户只能读取权限: 在这些例子中,chmod命令后面的三个数字代表了不同的权限组: 第一位表示所有者的权限。 第二位表示所属组的权限。 第三位表示其他用户的权限。 每个数字可以使用 0 7 之间的数值来表示权限: 0 表示没有权限。 1 表示执行权限。 2 表示写权限。 4 表示读权限。 可以根据需要自由组合这些数字来设置文件或目录的权限。 top 命令和 free 命令都可以查看内存,有什么区别? free 命令主要是查看系统的内存使用情况 物理内存: total :总物理内存大小 used :已使用的内存 free :未使用的内存 shared :共享内存大小 buff/cache :缓冲和缓存内存大小 available :当前可用的内存,考虑到了部分缓存可以被快速释放的情况 交换内存: total :总交换内存大小 used :已使用的交换内存 free :未使用的交换内存 top 命令,除了会显示系统内存情况,还会显示系统任务情况、CPU使用情况、各进程状态等信息。 用shell命令替换一个文件中的字符串 可以使用sed命令。以下是一个示例: 在上面的命令中, i选项表示直接在原始文件中进行修改,而不是输出到标准输出。s/旧字符串/新字符串/g是替换操作的模式,其中旧字符串是要替换的字符串,新字符串是替换后的新字符串。g表示全局替换,即一行中出现多次的旧字符串都会被替换。 请注意,这将直接修改原始文件,如果需要备份原始文件,可以在 i选项后面指定一个备份文件的扩展名,例如 i.bak,这将在替换前备份原始文件。 例如,假设要将文件example.txt中的字符串Hello替换为Hi,可以运行以下命令: sed和awk有什么区别? 都是用于文本处理命令的工具,区别在于: sed,主要用于对文本进行替换、删除、插入等操作。它适合对整行文本进行处理,可以通过正则表达式匹配文本进行操作。 awk,可以实现更复杂的文本处理逻辑,包括对字段的操作、条件判断、循环等。它适合处理结构化的文本数据,可以按列对数据进行处理。 sed适合简单的文本替换和编辑操作,而awk适合处理结构化的文本数据并实现更复杂的处理逻辑 查找日志中某个字符串出现的次数 / 匹配行的长度? 这里其实包含两类常见需求,要分清楚: 需求一:统计包含某个字符串的每一行的长度(不是字符串本身的长度) 找到日志中包含 的所有行。 输出的是 每一行的字符数 ( 默认等同于 ),并不是 本身的长度。 需求二:统计某个字符串在日志中出现的次数 会把每个匹配项独立输出一行,再用 统计行数,得到的就是 出现次数 。 返回的是 包含该字符串的行数 ,一行中出现多次只算一次,和上面是两种不同的含义。 常见的一个误区是写 ——这条命令会先取出所有包含 的 整行 ,再用 统计这些行的 总字符数 ,结果和"字符 c 出现的次数"完全不同,千万别用它来统计字符出现次数。 如果只是想知道一个字面字符串本身有多少个字符,直接 即可。 linux中有一个日志文件,日志文件中记录了访问请求的信息,第一列是访问的日期,第二列是请求的ip,第三列是请求的耗时,写一条shell命令来查到请求耗时最高的10条记录 要查找请求耗时最高的10条记录,可以使用以下Shell命令: 在上面的命令中,sort k3 nr用于按第三列(请求耗时)进行倒序排序。 k3表示按第三列排序, n表示按数字排序, r表示倒序排序。然后,使用head n 10来获取排序后的前10行,即耗时最高的10条记录。 将命令中的“日志文件”替换为实际的日志文件路径,即可查找到请求耗时最高的10条记录。 假如cpu跑到100%,你的解决思路是什么? 思路如下: 先通过 命令,定位到占用 CPU 高的进程 PID; 通过 或 找到该进程中占用 CPU 高的线程 ID(TID); 查看对应线程的调用栈,根据进程类型选择合适的工具: Java 进程 :把线程 ID 转为十六进制后,用 搜索对应线程的堆栈( 仅适用于 JVM 进程); C/C++ 或其他 native 进程 :可以用 、 或 观察运行中的热点函数和系统调用; 根据输出的堆栈信息,去项目中定位代码,看是否发生了死循环、热点计算或频繁系统调用,导致 CPU 跑到 100%。 Linux 服务器当中如何查看负载情况?通过什么指标进行查看? 通常我们发现系统变慢时,我们都会执行top或者uptime命令,来查看当前系统的负载情况,比如像下面,我执行了uptime,系统返回的了结果,最后一个就是系统平均负载的情况。 Load Average的三个数字,依次则是过去1分钟、5分钟、15分钟的平均负载。可以通过观察这三个数字的大小,可以简单判断系统的负载是下降的趋势还是上升的趋势。 负载值一般不超过cpu核数的1 1.5倍,如果超过1.5倍,那就要重视,此时会严重影响系统。 如果 load average: 1.00, 5.00, 10.00 三个数字依次增大,则说明在过去的 1 分钟系统的负载比过去 15 分钟系统的负载小,表明系统的负载是下降的趋势。 如果 load average: 10.00, 5.00, 1.00 三个数字依次降低,则说明在过去的 1 分钟系统的负载比过去 15 分钟系统的负载大,表明系统的负载是上升的趋势。 如果 load average: 0.07, 0.04, 0.0 三个数字基本相同,或者相差不大, 表明系统的负载是平稳的。 平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。 而 CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。比如: CPU 密集型进程,使用大量 CPU 会导致 平均负载升高 ,此时这两者是一致的; I/O 密集型进程,等待 I/O 也会导致 平均负载升高 ,但 CPU 使用率不一定很高; 大量等待 CPU 的进程调度也会导致 平均负载升高 ,此时的 CPU 使用率也会比较高。 我们现在很清楚的知道导致平均负载高的情况,不只是看 CPU 的使用率,也要观察系统 I/O 等待时间高不高。 当发现平均负载升高时,可以使用 mpstat 命令查看 CPU 的性能。 从上面发现 CPU 的用户层(%usr)使用率高达45%左右; CPU 的系统层(%sys)使用率高达50%左右; CPU 的 I/0 等待(%iowait)占用率为0.41%; CPU 的空闲率(%idle)只有2 3%。 可以推断出是由于 CPU 使用率导致平均负载升高的情况。 假设只有 CPU 的I/0 等待(%iowait)占用率高,CPU 用户层和系统层使用率很轻松,那么导致平均负载升高的原因就是 iowait 的升高。 判断了是因为 CPU 使用率升高还是 iowait 升高导致平均负载升高后,我们还需要定位是哪个进程导致的。可以用 pidstat 来查询: 可以发现是 events/0 和 events/1 内核进程 CPU 使用率非常高,所以可能这两个进程导致平均负载升高。 怎么判断服务器内存是否够用?如何查看服务器性能瓶颈是否是内存? 使用 free 命令查看内存使用情况 使用 free m 命令可以查看内存的总体使用情况,输出结果会大致如下: 关注以下几项: used :已经使用的内存。 free :可用的空闲内存。 available :可用的内存,这包括了操作系统缓存,这个值更能代表实际可用内存。 如果 available 的值长期很低,可能表明内存不足。 通过观察是否频繁使用 Swap 空间 可以通过 free 命令观察 Swap 空间的使用情况: 如果 Swap 空间使用过多(例如,接近 Swap total),说明物理内存不足。 检查 dmesg 输出是否有 OOM(Out of Memory)信息 查看 /var/log/messages 或者使用 dmesg 命令来查看系统日志,检查是否有 OOM(Out of Memory)错误。 如果存在 OOM 错误,说明内存不足是一个明显的问题。 使用 vmstat 观测内存使用状况 vmstat 是另一个强大的工具,可以帮助你监控系统的内存使用情况。执行 vmstat 1 每秒刷新一次: 特别关注以下字段: si(swap in)和 so(swap out):如果这两个值较高,说明系统频繁使用交换空间,表明物理内存可能不足。 free:空闲内存。 buff 和 cache:缓存和缓冲区的使用情况。 如何判断内存是否是满的情况?通过什么指标判断内存的使用率? 如果 free 和 available 都非常低,而 used 很高,内存基本上是满的。 Swap 使用频繁且使用率较高,那么内存基本上是满的。 如果 dmesg 日志,出现 OOM 相关信息,说明内存不足导致了一些进程被杀掉。 ps 或 top 显示大部分内存被少数几个进程占用,那么内存基本上是满的。 怎么判断操作系统有没有在内存替换?或者说怎么统计内存替换的频率? 我们可以使用 sar B 1 命令来观察: 图中红色框住的就是后台内存回收和直接内存回收的指标,它们分别表示: pgscank/s : kswapd(后台回收线程) 每秒扫描的 page 个数。 pgscand/s: 应用程序在内存申请过程中每秒直接扫描的 page 个数。 pgsteal/s: 扫描的 page 中每秒被回收的个数(pgscank+pgscand)。 如果系统时不时发生抖动,并且在抖动的时间段里如果通过 sar B 观察到 pgscand 数值很大,那大概率是因为「直接内存回收」导致的。 最新的图解文章都在公众号首发,别忘记关注哦!!如果你想加入百人技术交流群,扫码下方二维码回复「加群」。