第4章 Linux基础与Shell编程考察点、回答框架、企业侧重点

本章聚焦阿里云自动化工程师面试中Linux基础命令与Shell脚本编程的核心考题。掌握系统排查、脚本调试、进程管理、权限控制等技能是必备能力。下面以知识总览开头,再展示回答框架与追问路径,最后通过三个高频问答卡片强化实战训练。

知识模块核心考察点企业侧重点
进程与服务管理ps/top/pgrep, 信号, systemctl, 守护进程故障排查、自动化巡检脚本、服务自愈
文件与权限chmod/chown, umask, ACL, 特殊权限安全基线、日志权限、多租户环境
文本处理grep/sed/awk, 管道与重定向, 正则日志分析、配置生成、数据清洗
Shell脚本编程变量、条件分支、循环、函数、错误处理可维护性、健壮性、性能优化、异常捕获
系统监控与排查CPU/内存/磁盘/网络, iostat/vmstat/ss性能瓶颈定位、资源倾斜、告警响应
明确问题与目标 选择核心命令/参数 组合管道/脚本结构 执行并验证结果 异常处理与优化

问答卡片 1:服务自检与启动脚本

面试问题:写一个Shell脚本,检查Nginx服务是否运行,若未运行则启动它并记录日志到 /var/log/nginx_check.log。

面试官考察点:进程检测方式(pgrep/pidof)、条件判断与退出码、服务启动命令(systemctl)、日志重定向与时间戳、脚本健壮性(set -e)。

回答框架:

  1. 使用 pgrep -x nginx 检查进程,捕获退出码。
  2. 若退出码非0,执行 systemctl start nginx。
  3. 将启动结果(含日期)追加到日志文件。
  4. 脚本头部加 #!/bin/bash 和 set -e。
  5. 添加判断逻辑:若启动失败则额外告警。

示例回答:使用 pgrep -x nginx 检测进程,若退出码非0则 systemctl start nginx,并将日期和状态追加到日志。脚本开头加 set -euo pipefail 确保错误中断。约85字。

可能追问:如何防止脚本重复执行导致多次启动?如何设置cron定时检查?如何记录启动失败的具体错误?

避坑提醒:避免用 killall -0 判断进程,可能误判;推荐 pgrep -x 精确匹配进程名。生产环境中先尝试优雅启动(systemctl),不要直接后台 nohup。
Shell脚本追问 健壮性检查 性能优化 错误处理 环境兼容 日志规范

问答卡片 2:IP访问统计(awk/sort/uniq)

面试问题:请使用awk和管道统计 /var/log/access.log 中每个IP的访问次数,并输出前10个IP。

面试官考察点:awk提取字段、sort排序、uniq -c去重计数、逆序排序、head截取;对日志格式的理解。

回答框架:

  1. awk取第一列:awk '{print $1}';
  2. 管道给 sort 排序;
  3. uniq -c 合并计数;
  4. sort -nr 按数字降序;
  5. head -10 取前十。

示例回答:awk '{print $1}' /var/log/access.log | sort | uniq -c | sort -nr | head -10。第一列是IP,先排序保证uniq正确,再逆序显示。约60字。

可能追问:如果日志是自定义格式,IP不在第一列怎么处理?如何排除内网IP?如何输出成CSV文件?

避坑提醒:务必先 sort 再 uniq,否则计数不准。生产环境建议先 head -1 确认字段位置,防止解析错误。

问答卡片 3:CPU飙高排查流程

面试问题:如果Linux系统CPU使用率持续100%,请写出排查步骤和涉及的命令。

面试官考察点:top排序、ps辅助、strace/perf定位、性能分析思路;生产环境操作谨慎。

回答框架:

  1. 执行 top 按 CPU 排序(按P)找到PID;
  2. 用 ps -p PID -o %cpu,pid,cmd 确认进程详情;
  3. 若需要,用 strace -cp PID 统计系统调用耗时;
  4. 或用 perf top -p PID 看热点函数;
  5. 根据分析结果决定重启或优化。

示例回答:先 top 按 P 找到最耗CPU的PID,再用 ps aux | grep PID 查看命令行。然后 strace -p PID -t 跟踪读/写调用,或 perf top -g -p PID 看调用栈。约90字。

可能追问:如何查看每个线程的CPU占用?如何分析内存或磁盘IO?如何在不影响业务的情况下降级?

避坑提醒:不要直接 kill -9,应先用 kill -15 优雅终止。strace 会极大降低进程性能,生产慎用;可先尝试 ps -T -p PID 看线程级别。