
Linux面试题经典Linux面试题常见Linux面试题带答案这段时间一直在帮团队做Linux方向的招聘前前后后整理了几十份面试题也实际面了不少候选人。每次面完我都会把问过的问题、踩过的坑、候选人的典型回答重新过一遍慢慢就沉淀出一套经典、常见、还带答案的Linux面试题库。今天就把它们按知识模块整理出来题目覆盖文件命令、用户权限、进程管理、网络排查、磁盘文件系统、Shell脚本这几个方向基本是面试官最爱问、也是工作中最容易出实际问题的核心考点。这篇文章适合正在准备Linux运维、SRE、后端开发、嵌入式Linux相关岗位面试的同学也适合平时只会在界面上点点点、想系统补一下基础的人。我不会只给一句答案是xxx而是会把面试官在考察什么、为什么这么答、实际工作里这是个什么场景都讲清楚争取让你看完之后不是背题而是真正能把原理讲明白。1. 基础命令类高频面试题基础命令这部分几乎是所有Linux面试的暖场题同时也是淘汰率最高的一个环节。很多候选人能背出grep、find、awk的语法但一旦面试官把问题换成实际工作场景比如线上日志一直刷报错你想统计每个小时报错多少次不少人就会卡住。所以这部分的面试题看起来简单背后考察的是你平时有没有真的在命令行里干过活。1.1 文件查询与文本处理面试中的必考题面试题如何在一个大日志文件里快速找到包含某些关键字的行并统计出现次数这道题看似基础答案一般都会说用grep但真正拉开差距的地方在于# 基础查法 grep ERROR app.log # 带行号、忽略大小写 grep -n -i error app.log # 统计出现次数 grep -c ERROR app.log这里有几个细节必须知道。grep -c统计的是有多少行匹配不是有多少个匹配。如果一行里出现了10次ERRORgrep -c只会记1行。真要统计出现的次数得上grep -ogrep -o ERROR app.log | wc -l这个区别在面试里出现频率极高我见过不少候选人就在这个地方栽跟头。实际应用里排查线上问题时常常还要配合时间维度来统计这就会用到更进阶一点的组合# 统计每个小时ERROR出现的次数 grep ERROR app.log | cut -d: -f1-2 | uniq -c这里的思路是先把ERROR行筛出来再用cut把小时字段截出来最后用uniq -c去重计数。注意uniq只能处理相邻的重复行所以前面必须先sort排序或者在知道时间戳本身就有序的情况下直接用。很多面试官会追问为什么我uniq -c统计出来的数是乱的答案就在这里。面试题如何找到系统中大于100M的文件find / -type f -size 100M -exec ls -lh {} \;考察点有两个。一个是find的-size语法100M表示大于100MB-100M表示小于精确大小不带符号。另一个是为什么用-exec而不用管道因为xargs在遇到文件名里包含空格或特殊字符时会出问题-exec更加稳妥。实际生产环境里磁盘告警时用这条命令能快速定位大文件。1.2 管道与重定向理解数据流的正确姿势面试题管道符|和重定向有什么区别标准错误怎么单独输出到文件这道题考的是操作系统底层的数据流概念。管道是把前一个命令的标准输出作为后一个命令的标准输入重定向是把命令的输出写到文件里或者从文件读入。更关键的是标准错误的重定向# 标准输出和标准错误分开存 some_command output.log 2 error.log # 丢弃标准错误只保留标准输出 some_command output.log 2/dev/null # 标准输出和错误全写进同一个文件 some_command all.log 21这里必须彻底理解21为什么要放在后面而且21和12是不同的。21是把标准错误重定向到当前标准输出指向的地方所以如果写成some_command 21 all.log标准错误还是去了终端而不是文件。这个顺序问题非常经典不少工作两三年的候选人都会回答错。实际场景里还有个高频用法就是nohup启动服务时把日志重定向nohup java -jar app.jar /app/logs/run.log 21 面试如果只到这一步那还是基本功。对方接着追问的话大概率会问管道和重定向组合的情况比如把进程输出过滤之后写文件ps -ef | grep java | grep -v grep java_process.txt这里grep -v是排除也是日常排查进程时必用的思路因为直接ps | grep的时候会匹配到grep自己的进程必须排除掉。2. 用户权限与文件系统专题用户和权限是Linux安全模型的核心也是每个面试官必问的大模块。这个模块我最深的体会是很多人会背chmod 777但完全不知道为什么要这样设计更不知道系统里那些默认权限是怎么设置的。面试时如果能把权限模型讲清楚很容易和只会背命令的候选人拉开差距。2.1 用户管理新建用户到sudo授权的完整链路面试题如何新建一个用户并给它sudo权限实操步骤通常是这样的# 新建用户并创建家目录 useradd -m testuser # 设置密码 passwd testuser # 加入sudo组Debian/Ubuntu系 usermod -aG sudo testuser # 或者加入wheel组CentOS/RHEL系 usermod -aG wheel testuser每一步都值得展开讲讲。useradd不带-m参数时很多发行版默认不创建家目录用户登录之后连home都没有在/home下找不到自己的目录就会一脸懵。passwd是单独一步因为useradd本身不提供交互设置密码的能力这是它和adduserDebian系封装脚本的显著区别。usermod里的-aG参数-a是append追加-G是附加组如果漏了-a这个用户的附加组会被整个覆盖掉原来加过的组全没了这是生产环境里发生过不少次的事故。面试官还喜欢追问添加sudo权限除了加组还有没有别的办法答案是直接改sudoers文件# 推荐用visudo编辑不要直接vi保存时会检查语法 visudo # 然后添加一行 testuser ALL(ALL) NOPASSWD:ALLNOPASSWD表示执行sudo时不需要再输一次密码。实际部署脚本和自动化运维时经常需要给某个用户免密sudo权限这条配置就很有用。不过安全起见尽量把权限限定在特定命令上。2.2 权限模型从rwx到ACL的进阶认知面试题Linux文件权限rwx分别代表什么数字权限755、750、644分别是什么意思先快速过一下基础r表示读4w表示写2x表示执行1。权限位一共三组分别是属主、属组、其他人。常用目录和文件的权限规则是目录一般755普通文件644可执行文件或脚本755。这里要重点区分文件权限和目录权限的差异。文件有x权限代表可以执行这个文件目录有x权限代表可以进入这个目录。两个目录正则进不去往往不是没有r权限而是没有x权限。这个细节每次面试都会有人翻车。面试题sticky bit是什么意思/tmp为什么是1777这个属于进阶题。sticky bit粘滞位主要用在共享目录上作用是让目录里的文件只能被文件属主、目录属主或root删除别人即使对目录有写权限也删不了你的文件。/tmp的权限是17771就是sticky bit777是所有人可读可写可执行。面试官一般还会追问那如果没有sticky bit/tmp会怎样答案是任何用户都能删掉别人的临时文件系统安全性和可用性都会出问题。还有setuid和setgid这两个特殊权限。面试常考的就是为什么/usr/bin/passwd这个命令属主是root却带着s权限ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 68208 ...这个s就是setuid位意思是任何用户执行这个命令时会临时拥有命令属主root的权限。因为修改密码必须去写/etc/shadow而这个文件只有root能写所以passwd命令必须通过setuid拿到root权限。理解了这个机制才算真正理解了Linux权限模型。3. 进程管理与系统资源排查线上系统出问题时大部分都和进程、资源相关。这个模块面试不仅考命令还考排查思路是所有Linux面试题里最活的部分。我面过很多候选人命令背得很熟一说排查思路就乱了只能一条命令一条命令地试没有整体规划。这里我会把常用的排查链路一起讲清楚。3.1 进程查看与信号控制面试题ps -ef和ps aux有什么区别怎么杀一个进程这两个命令本质一样都是查看进程信息区别在于输出格式。ps aux是BSD风格ps -ef是System V风格。日常使用ps aux更多一些因为能看到CPU和内存占用率而ps -ef输出里没有这两列。杀进程这块重点在于对kill信号的理解# 正常终止让进程做清理工作 kill -15 PID # 强制杀死内核直接回收进程 kill -9 PID # 批量杀匹配某个名字的进程 pkill -f java -jar app.jar # 杀掉某个进程的所有子进程 pkill -P PID面试官一定会追问kill -15和kill -9的区别。这里有一个很多人忽略的关键点kill -15是发送SIGTERM信号告诉进程你可以准备一下然后退出进程可以捕获这个信号做清理工作比如保存配置、关闭数据库连接然后自己退出。kill -9是SIGKILL信号直接由内核强制杀掉进程进程没有任何机会做善后一旦杀错就可能丢数据或者留下残缺的临时文件。所以正确的做法永远是先kill -15等几秒看进程退不退实在不行再kill -9。3.2 系统负载分析与性能排查思路面试题服务器CPU飙到100%怎么排查这道题几乎是我每次面试必问的。回答的质量能直接反映候选人是不是真的处理过线上问题。一个比较完整的回答应该是这样的第一步先用top看一眼整体情况top按大写P按CPU排序按大写M按内存排序按大写T按时间排序这三个快捷键必须记住。top第一行的load average是1分钟、5分钟、15分钟的平均负载这个数字如果长期大于CPU核心数说明系统处于过载状态。第二步定位到CPU占用高的进程之后如果是多线程应用还要进一步找到具体是哪个线程在跑# 查看进程内所有线程的状态 top -Hp PID # 或者把线程信息dump出来 ps -Lf PID第三步根据应用类型深入排查。Java应用就jstack PID导出线程栈找到对应线程编号C/C应用可以用gdb或者strace看系统调用如果是PHP、Python脚本可能要配合业务日志来看。还有一点经验CPU打满很多时候不是计算密集而是死循环或者频繁GC这些都要结合具体情况分析。面试还有一个变体load average高但CPU使用率不高是什么原因答案是系统在等IO比如磁盘读写慢、网络IO阻塞进程处于不可中断睡眠状态D状态。排查时用iostat看磁盘、用vmstat看系统整体IO情况。这个问题的精髓在于load average是可运行线程不可中断睡眠线程的数量它不等于CPU使用率。4. 网络配置与故障排查网络是Linux环境里绕不开的重头戏。不管是服务上不了网、端口被占用、还是数据库连不上最终都要回到网络排查。面试官在这个模块一般会出场景题比如给你一台服务器SSH连不上你怎么排查这种题目没有标准答案但回答的完整度能看出候选人的经验深浅。4.1 IP地址配置与DNS解析通过配置看原理面试题Linux下怎么配置IP地址改了配置不生效怎么处理不同发行版的配置方式差异很大。CentOS 6/7用/etc/sysconfig/network-scripts/ifcfg-eth0这类文件Ubuntu 18.04之后用netplan的yaml配置老Debian/Ubuntu则用/etc/network/interfaces。无论哪种核心概念都一样网卡名、IP地址、掩码、网关、DNS。CentOS系列里需要改的内容大概是BOOTPROTOstatic ONBOOTyes IPADDR192.168.1.100 NETMASK255.255.255.0 GATEWAY192.168.1.1 DNS18.8.8.8Ubuntu的netplan是yaml格式缩进极度敏感一个小空格错误整个配置都应用失败。改完配置之后还需要systemctl restart networking或者netplan apply才能生效。这里面试官常问的坑是临时用ifconfig或ip addr add配置的IP重启之后就没了因为它们只是运行时修改没写进配置文件。DNS这块也是高频考点。配置文件在/etc/resolv.conf但很多发行版这个文件会被NetworkManager覆盖直接改经常生效不了。排查DNS问题时一条命令链路是# 测试系统解析 getent hosts www.example.com # 测试指定DNS服务器解析 nslookup www.example.com 8.8.8.8 # 用dig看详细过程 dig www.example.com面试场景题能ping通IP但域名解析不了怎么排查这个场景我线上遇得多了很多时候就是DNS服务器配置错了或者/etc/resolv.conf被清空了。回答思路是先确认不是网络层问题能ping通IP说明链路是通的然后用nslookup指定一个公共DNS测试能解析就是本地DNS配置坏了不能解析就是域名本身解析有问题或者上游DNS挂了。这个链路说出来面试官就知道你脑子里有清晰的排查路径。4.2 端口与连接排查面试题怎么查看某个端口被哪个进程占用# ss命令现代推荐用法 ss -lntp | grep :8080 # netstat老命令部分系统默认没装 netstat -lntp | grep :8080 # lsof 按端口倒查 lsof -i :8080这里要注意几个参数-l显示监听的端口-n不反解域名显示数字地址-t只看TCP-p显示进程信息。面试时经常有人端口没写对比如ss -lntp看到的是00:80808080前面有个*号这表示监听在所有网卡的8080端口。如果写成了127.0.0.1:8080就说明只监听了回环地址外部机器访问不了——这是排查端口明明开了但别人连不上的典型原因之一。还有一个实用命令fuser可以直接杀掉占用端口的进程fuser -k 8080/tcp这条命令在实际工作中非常有用比如tomcat启动报端口被占用用fuser -k 8080/tcp直接解决。但要注意它会直接杀掉占用端口的进程操作前必须先确认这个进程是不是可以被杀的服务。5. 磁盘与文件系统管理磁盘满、inode耗尽、删文件不释放空间这些问题在线上环境里几乎每个月都会遇到几回。面试官在这个模块特别喜欢出实际案例既考命令又考对Linux存储机制的理解。5.1 磁盘占用分析与清理面试题磁盘满了怎么办这个问题的标准回答流程是这样的# 1. 先看整体情况 df -h # 2. 定位哪个目录占用最大 du -sh /* 2/dev/null | sort -hr | head # 3. 逐层深入找大文件 find / -type f -size 1G -exec ls -lh {} \;很多人都能走到前三步真正的分水岭在下一步。如果df显示磁盘满了但du统计了半天都找不到大文件或者明明删了文件空间还是没释放就要考虑到文件被进程占用但已经删除的情况# 查看已删除但仍被占用的文件 lsof | grep deleted这个场景在日志文件上特别常见。程序打开了日志文件运维用rm把它删了但进程还持有文件句柄空间一直没有真正释放。解决办法是找到对应进程重启或者kill掉空间才会真正回来。面试官还会问一个变体磁盘还有空间但写不进文件报No space left on device怎么回事答案可能是inode耗尽了。查一下df -i如果Inodes这一列是100%说明小文件太多了把inode用完了。磁盘够inode不够同样不能创建新文件。清理思路就是找那些目录下文件数特别多的地方删掉不需要的临时文件。这个问题虽然不难但实操中非常多见面试时答出来会非常加分。5.2 文件系统与inode认知面试题硬链接和软链接有什么区别这是一个非常经典的考察点。硬链接和软链接的根本区别在于底层存储机制。硬链接多个文件名指向同一个inode也就是同一份数据。删除其中任何一个文件名只要还有别的链接指向这个inode数据就还在。硬链接不能跨文件系统创建也不能针对目录创建。软链接软链接最直观的理解就是Windows里的快捷方式。它本身是一个独立的小文件内容存的是目标文件的路径字符串。目标文件被删了软链接就变成broken状态。# 硬链接 ln /path/to/file /path/to/hardlink # 软链接 ln -s /path/to/file /path/to/softlink判断一个链接是硬链接还是软链接chmod之后看inode号或者看ls -l输出软链接的文件名后面会带-指向路径硬链接看起来和普通文件一样只是inode号相同。面试官常追问的就是软链接文件被删了怎么排查这个可以配合readlink、stat命令来看。还有一个考得比较细的点硬链接和文件复制有什么区别复制是新建了一个inode和一份新数据修改其中一份不影响另一份硬链接是同一份数据多个文件名修改任何一个文件名下的内容另一个也能看到变化。6. Shell脚本与文本三剑客Shell脚本是Linux能力的重要分水岭。基础命令是搬砖会写脚本就是能把重复工作自动化。面试里Shell相关的题目也比较两极分化简单的考语法难一点的考实战场景。我见过不少候选人grep和awk用得很溜但让他写个带循环的脚本就卡壳说明平时的自动化水平还不够。6.1 条件判断与循环写脚本的基本功面试题用Shell写一个脚本输出1到100之间所有能被3整除的数。先看一个面试中的常见答案#!/bin/bash for i in $(seq 1 100); do if [ $((i % 3)) -eq 0 ]; then echo $i fi done写这段脚本的人基本语法是过关的但有几个细节可以优化。首先$((i % 3))是算术展开[-eq]两边必须是整数不能有空格问题这个写法没问题。其次如果追求效率可以改步长#!/bin/bash for i in $(seq 3 3 100); do echo $i done这种写法直接跳过了不需要判断的数意味着循环次数下降三分之一。虽然对面试结果没决定性影响但能体现出你平时会考虑脚本的执行效率。脚本里还有一个高频考点就是条件判断里test命令的写法。下面几种写法的区别必须搞清楚# 判断文件是否存在 [ -f /etc/passwd ] # 判断目录是否存在 [ -d /tmp ] # 判断字符串是否为空 [ -z $VAR ] # 判断变量是否相等 [ $VAR test ]注意[和变量之间有空格变量要用双引号包起来防止变量为空时语法错误。这个细节极其容易被忽略但线上脚本出bug十有八九都是这个原因。6.2 awk与sed的实战用法面试题从nginx访问日志里统计每个IP的访问次数按从高到低排序输出前10个。这是一道非常经典的实战题结合了awk、sort、uniq、head一串命令awk {print $1} access.log | sort | uniq -c | sort -rn | headnginx默认日志格式第一个字段是客户端IP所以awk {print $1}就能取出IP。sort是先排序让相同IP相邻uniq -c才能正确统计次数sort -rn是按照次数从大到小排序head取前10条。这个命令链里每一步都不能少少了sortuniq统计的就会错乱。实际生产环境里统计PV、UV、接口调用量也基本都是这套思路。sed也是文本处理大户。最常用的就是替换# 全局替换 sed -i s/old/new/g file.txt # 只替换第一次出现 sed -i s/old/new/ file.txt # 删除匹配行 sed -i /pattern/d file.txt这里的坑主要在于跨平台兼容。macOS的sed -i要求必须带一个备份后缀比如sed -i s/old/new/g file.txt而Linux直接sed -i就行。如果脚本要在两种环境跑建议用sed -i.bak然后用完删掉备份文件或者干脆改用perl -pi -e至少跨平台一致性会好一些。这种事只有真正在Mac和Linux之间来回切换工作过的人才会知道。7. 面试综合场景题与答题策略前面几大部分是单点知识到了面试后期面试官一定会出综合场景题。这类题目没有唯一答案考察的是你有没有一套清晰的排查方法论。答得好的人往往在面试官说出场景的那一瞬间脑子里就已经浮现出完整的命令链路了。7.1 服务器异常排查从现象到定位的完整链路面试场景题半夜收到告警说某台服务器负载很高登录上去之后你会按什么顺序排查这道题综合度很高我的回答一般是这样的第一步先看现象的整体面# 负载和运行时长 uptime # 内存使用概览 free -h # 磁盘空间和IO情况 df -h iostat -x 1 # 系统日志看有没有kernel报错 dmesg -T | tail -50第二步用top定位到具体是哪个进程吃资源top -o %CPU第三步根据进程类型进一步深挖。如果是数据库关注慢查询如果是Web服务可能要看请求量突增如果是Java应用jstack导出线程栈。这一步没有一个固定答案也是区分候选人经验深浅的地方。这种题面试官真正想看到的不是你背了多少命令而是你有没有一套从现象到根因的思考路径。最忌讳的回答是我上去先top看看就没了。至少应该遵循先看整体负载→再看具体进程→再分析为什么这个进程会高这样的递进逻辑。7.2 面试官没说的潜规则答题话术与避坑清单最后聊点面试中不太好量化、但直接影响结果的潜规则。第一回答问题先说结论再讲过程。面试官问怎么看端口占用不要上来就背命令参数先说我会用ss -lntp查看正在监听的所有TCP端口如果需要定位到具体进程再加-p参数这个顺序能让对方快速理解你的思路。第二不确定的事情大方承认别硬编。面试官经验丰富编的答案一听就假。比如连ps aux的CPU使用率是累计值还是瞬时值这种问题都拿不准的话直接说我平时一般用top看CPUps这块没细研究过反而会留下诚实、不装懂的好印象。第三尽量结合线上经验补充细节。比如回答完磁盘满的排查步骤补一句如果是日志文件被删除但进程还占着句柄需要用lsof|grep deleted才能找到真正占空间的文件。这种细节不可能从书里背出来只要讲一两句面试官就会把你和其他候选人的层次区分开来。第四注意别犯基础错误。比如把chmod和chown记反、把软链接硬链接的概念说反、ip addr和ifconfig混在一团、DNS配置文件路径说成/etc/resolv.conf但说不出其它相关文件这些都是扣分点。基础命令记错一两个也许还能容忍概念性错误印象分一下子就会拉下来。我个人的体会是Linux面试题准备到最后拼的不是死记硬背而是你对操作系统基本原理的真正理解。把每个命令背后为什么这样设计想透彻面试时自然能举一反三。这套题目看起来是一道道题其实是一张网——只要把这些知识点串成一线面试官怎么变换场景你都能接得住。