Shell面试题更新 2026-08-05

请编写一个 Bash 脚本,用于检查系统中所有服务的运行状态。

运维/技术支持业务理解编码实现问题排查

考察说明

考查候选人对 Bash 脚本编写、系统服务管理以及状态检查的掌握程度。

回答思路

  1. 【回答框架 1】首先,明确脚本的目标是遍历系统中所有服务并输出其状态。可以使用 systemctl 命令(适用于 systemd 系统),通过 `systemctl list-units --type=service --all` 获取所有服务列表,包括已激活和未激活的服务。
  2. 【回答框架 2】然后,脚本需要逐行解析该命令的输出,提取服务名称和状态字段。可以使用 while read 循环配合正则表达式或 awk 来处理行内容,确保能够正确获取每个服务的名称(unit 名)和激活状态(active/inactive/failed 等)。
  3. 【回答框架 3】对于每个服务,可以根据其状态决定输出格式,例如对 active 服务输出正常信息,对 failed 服务给出警告或错误提示。为使脚本更健壮,可以添加错误处理,例如检查命令是否存在(如使用 command -v systemctl),并在服务状态异常时返回非零退出码。
  4. 【回答框架 4】最后,为了提高脚本的可复用性,可以接受可选参数,例如允许用户指定服务名称来检查特定服务,或者提供不同级别的输出(如仅显示异常服务)。脚本编写时要注意兼容性,如果系统使用 SysV init 而不是 systemd,则需使用 service 或 chkconfig 命令,但现代系统通常默认使用 systemd。
  5. 【关键点 1】使用 systemctl list-units --type=service 获取所有服务列表
  6. 【关键点 2】逐行解析输出,提取服务名和状态,并分类输出
  7. 【关键点 3】对异常状态(如 failed)给出明显提示,并可设置合适的退出码
  8. 【关键点 4】考虑脚本的可扩展性,如支持参数传入服务名过滤
  9. 【易错点 1】不要误以为 systemctl list-units 的输出格式固定不变,应使用 awk/substr 等工具稳健解析
  10. 【易错点 2】忽略服务状态的动态变化,可能造成误判,应基于当前实际状态输出
  11. 【易错点 3】未考虑非 systemd 系统,脚本兼容性不足,需在文档中说明或添加判断逻辑