news 2026/4/18 15:35:56

请编写一个 Bash 脚本检查系统中的所有服务状态(中等)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
请编写一个 Bash 脚本检查系统中的所有服务状态(中等)

👨‍⚕️主页: gis分享者
👨‍⚕️感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨‍⚕️收录于专栏:Shell 面试

文章目录

  • 一、🍀前言
    • 1.1 ☘️示例
    • 1.2 ☘️知识扩展

一、🍀前言

可以使用 systemctl 命令来列出和检查服务状态,这是一个用于管理 Systemd 服务的命令行工具。

1.1 ☘️示例

基本示例:

#!/bin/bash# 列出所有服务并保存到变量services=$(systemctl list-units--type=service--all)# 打印标题echo"Service Name Load State Active State Sub State"# 读取每个服务的状态whileread-r service;do# 检查服务名称和状态echo"$service"|awk'{printf "%-20s %-12s %-12s %-12s\n", $1, $2, $3, $4}'done <<<"$services"

运行这个脚本,它会列出所有的服务名称和它们的加载状态、激活状态及子状态。

示例一:

#!/bin/bash# 系统服务状态检查脚本# 用于检查系统中所有服务的运行状态echo"=================================="echo" 系统服务状态检查报告"echo"=================================="echo# 检查系统类型和可用的命令check_system_type(){ifcommand-v systemctl >/dev/null 2>&1;thenecho"检测到 systemd 系统"return1 elif command-v service >/dev/null 2>&1;thenecho"检测到 SysVinit 系统"return2elseecho"未检测到支持的服务管理工具"return0 fi}# 使用systemctl检查服务状态 (systemd系统)check_systemd_services(){echo"正在检查 systemd 服务状态..."echo"----------------------------------"# 统计信息local total_services=$(systemctl list-units--type=service|grep-v"LOAD\|listed"|wc-l)local active_services=$(systemctl list-units--type=service--state=active|grep-v"LOAD\|listed"|wc-l)local inactive_services=$(systemctl list-units--type=service--state=inactive|grep-v"LOAD\|listed"|wc-l)local failed_services=$(systemctl list-units--type=service--state=failed|grep-v"LOAD\|listed"|wc-l)echo"总服务数:$total_services"echo"运行中:$active_services"echo"已停止:$inactive_services"echo"失败:$failed_services"echo# 显示失败的服务if[$failed_services-gt0];thenecho"失败的服务列表:"systemctl list-units--type=service--state=failed--no-pager|grep-v"LOAD\|listed"echofi# 显示所有服务状态摘要echo"服务状态摘要:"systemctl list-units--type=service--no-pager|grep-v"LOAD\|listed"|awk'{print $2": "$4}'|sort}# 使用service命令检查服务状态 (SysVinit系统)check_sysvinit_services(){echo"正在检查 SysVinit 服务状态..."echo"----------------------------------"# 检查 /etc/init.d/ 目录下的服务if[-d"/etc/init.d/"];then local service_count=0 local running_count=0 local stopped_count=0forservice in/etc/init.d/*;doif[-f"$service"]&&[-x"$service"];then service_name=$(basename"$service")service_count=$((service_count+1))# 检查服务状态if$servicestatus >/dev/null 2>&1;thenecho"$service_name: 运行中"running_count=$((running_count+1))elseecho"$service_name: 已停止"stopped_count=$((stopped_count+1))fi fi doneechoecho"统计信息:"echo"总服务数:$service_count"echo"运行中:$running_count"echo"已停止:$stopped_count"elseecho"未找到服务目录 /etc/init.d/"fi}# 检查特定服务check_specific_service(){local service_name=$1ifsystemctl is-active--quiet"$service_name"2>/dev/null;thenecho"$service_name: 运行中"elif systemctl is-active--quiet"$service_name"2>/dev/null;thenecho"$service_name: 已停止"elseecho"$service_name: 服务不存在或无法访问"fi}# 主程序main(){# 获取系统类型check_system_type system_type=$? case$system_typein 1)check_systemd_services;;2)check_sysvinit_services;;*)echo"错误: 不支持的系统类型"exit1;;esacechoecho"=================================="echo" 检查完成"echo"=================================="}# 检查是否提供了特定服务名称作为参数if[$# -eq 1 ]; thenecho"检查特定服务:$1"check_specific_service"$1"else# 执行完整检查main fi

示例二:

#!/bin/bash# 服务状态检查函数check_service_status(){# 检测初始化系统类型if[[$(ps--no-headers-o comm 1)=="systemd"]];thenecho-e"\n[Systemd 系统服务状态检查]"# 获取所有systemd服务单元systemctl list-units--type=service--all--no-pager|awk'NR>1 && !/loaded/ {print $1}'|whileread-r service;do# 过滤掉无效条目if[["$service"=~ \.service$]];then active_status=$(systemctl is-active"$service")enabled_status=$(systemctl is-enabled"$service"2>/dev/null||echo"unknown")printf"%-45s %-15s %-15s\n""${service%.*}""[Active:$active_status]""[Enabled:$enabled_status]"fi doneelseecho-e"\n[SysV Init 系统服务状态检查]"# 检查传统init系统服务if[-d/etc/init.d];then find/etc/init.d/-executable-typef-printf"%f\n"|whileread-r service;dostatus_output=$(service"$service"status 2>&1)if[["$status_output"=~"is running"]];then state="running"elsestate="stopped"fi printf"%-45s %-15s\n""$service""[Status:$state]"doneelseecho"未找到SysV初始化系统服务目录"fi fi}# 执行主函数check_service_status|less-S

脚本特点说明:

  • 智能初始化系统检测:

通过检查PID 1进程判断实际使用的初始化系统
支持systemd和传统SysV init系统

  • systemd系统处理:

使用systemctl list-units获取完整服务列表
显示服务激活状态(active/inactive)和启用状态(enabled/disabled)
过滤无效条目和标题行

  • SysV系统处理:

检查/etc/init.d目录中的可执行服务脚本
解析基础运行状态(running/stopped)

  • 输出优化:

格式化列对齐输出
通过管道连接less命令实现分页浏览
支持宽字符显示(-S参数保持折行)

1.2 ☘️知识扩展

1)systemctl 命令:systemctl 是一个核心工具,用于控制 Systemd 系统及服务管理器。你可以用它来启动、停止、重启、禁用和启用服务,还可以用来检查服务状态。

2)awk:这是一个非常强大的文本处理工具,特别适合格式化和筛选文本内容。在这个脚本中,我使用 awk 来格式化输出。

3)重定向操作符< 和 <<: Bash 中有多种重定向技术。这里使用了 <<<,它将右侧的字符串作为输入提供给左侧命令。这是一种方便的方式来处理多行字符串。

4)脚本的改进:为了使脚本更易读和更具扩展性,我们可以考虑以下几点:

添加错误处理:检查 systemctl 命令是否成功执行。
提供选择特定服务进行检查的功能。
输出结果到文件,以方便后续查阅。
改进版本的脚本:

#!/bin/bash# 检查 systemctl 命令是否可用if!command-v systemctl &>/dev/null thenecho"systemctl 命令不可用,请确保 Systemd 已安装。"exit1 fi# 获取所有服务的状态services=$(systemctl list-units--type=service--all)# 打印标题printf"%-20s %-12s %-12s %-12s\n""Service Name""Load State""Active State""Sub State"# 读取每个服务的状态并格式化输出whileread-r service;doecho"$service"|awk'{printf "%-20s %-12s %-12s %-12s\n", $1, $2, $3, $4}'done <<<"$services"# 将结果保存到文件echo"$services"> service_status.txtecho"服务状态检查完毕,结果已保存到 service_status.txt 文件。"
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 0:16:50

27.PXE高效批量网络装机

1.挂载镜像文件&#xff1a; mkdir -p /mnt/cdrom mount /dev/sr0 /mnt/cdrom 2.安装必要组件&#xff1a; sudo yum install -y httpd dhcp tftp-server syslinux xinetd 配置 TFTP 服务&#xff08;传输引导文件&#xff09; TFTP 用于传输 pxelinux.0、vmlinuz、initr…

作者头像 李华
网站建设 2026/4/18 2:00:23

对比接口测试工具在自动化测试优缺点:Jmeter、Python、Postman

一、JMeter总结&#xff1a;适合对代码不敏感的使用人员&#xff0c;不会代码也可以完成接口自动化&#xff0c;设计框架。适合紧急迭代的项目。JMeter接口测试的优势小巧轻量级&#xff0c;并且开源免费&#xff0c;社区接受度高&#xff0c;比较容易入门支持多协议&#xff0…

作者头像 李华
网站建设 2026/4/18 9:34:35

数据里的“平行宇宙”:用分支管理实现数据的版本控制

适用版本提示&#xff1a;本文提及的 Data Branch 功能适用于 MatrixOne v3.0 及以上版本。 我们想解决的不是“怎么再备份一份”&#xff0c;而是这三件事&#xff1a;随时落一个可靠锚点、开出互不打扰的试验台、把变更做成可审阅/可回放的补丁。 序幕&#xff1a;双线并行的…

作者头像 李华
网站建设 2026/4/19 1:25:27

SMT贴片加工生产车间主要设备有哪些

SMT的全称是SuRFace mount technology&#xff0c;中文意思为表面贴装技术&#xff0c;SMT设备是指用于SMT加工过程需使用的机器或设备&#xff0c;不同厂家根据自身实力规模以及客户要求&#xff0c;配置不同的SMT生产线&#xff0c;可分为半自动SMT生产线和全自动SMT生产线&a…

作者头像 李华
网站建设 2026/4/18 1:21:34

2026企业微信高效办公指南:打卡/审批/会议实操

2026年&#xff0c;仍有不少企业被考勤统计混乱、审批流程拖沓、会议信息丢失等问题困扰。而企业微信的打卡、审批、会议三大功能&#xff0c;能够通过链路串联的方式&#xff0c;一站式解决这些办公效率痛点。无论是企业高管希望降低人力管理成本&#xff0c;私域运营人员想要…

作者头像 李华
网站建设 2026/4/17 20:22:23

解锁淘宝API:实时监控商品价格变动,抢占市场先机!

在电商竞争激烈的时代&#xff0c;实时监控商品价格变动是抢占市场先机的关键策略。淘宝作为国内最大的电商平台&#xff0c;提供了丰富的API接口&#xff0c;允许开发者获取商品数据&#xff0c;包括实时价格。本文将一步步教你如何解锁淘宝API&#xff0c;实现商品价格的实时…

作者头像 李华