当前位置: 首页 > article >正文

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析

服务展示:

在这里插入图片描述

运行脚本:

在这里插入图片描述

剩余服务:

在这里插入图片描述

一、脚本设计背景与核心价值

在Linux服务器运维中,服务管理是日常操作的重要环节。本文介绍的智能服务管理脚本,集服务停止、状态检测、文件清理于一体,特别适用于以下场景:

  • 测试环境重置:快速清理测试数据
  • 安全应急响应:遭遇入侵时快速隔离服务
  • 资源回收:下线不再使用的服务组件
  • 系统维护:批量操作提升运维效率

二、脚本功能全景解析

1. 核心功能矩阵

功能模块实现方式技术亮点
服务停止systemctl + pkill双重检测支持包管理器和源码安装的服务
服务删除systemctl disable + 文件删除自动识别安装方式
状态检查systemctl + pgrep双重验证精确判断服务状态
日志记录tee命令实时记录完整操作审计轨迹
安全防护交互式确认提示防止误操作

2. 服务覆盖范围

支持的主流服务

  • 数据库类:MySQL, Redis, ClickHouse, PostgreSQL, MongoDB
  • 容器服务:Docker及容器实例
  • 监控系统:Prometheus, Grafana
  • Web服务:Nginx, Apache
  • 其他组件:RabbitMQ, Elasticsearch, InfluxDB等

三、关键技术实现解析

1. 智能服务停止机制

stop_service() {# 优先使用systemctl停止if systemctl list-unit-files | grep -q "^$service.service"; thensudo systemctl stop "$service"# 检测源码安装的服务elif pgrep -x "$service" > /dev/null; thensudo pkill -f "$service"fi
}

技术要点

  • 双重检测机制适配不同安装方式
  • 使用pgrep -x精确匹配进程名
  • 返回状态码区分操作结果

2. 服务残留清理算法

delete_service() {# 示例:清理Grafanaif [ "$service" = "grafana-server" ]; thensudo rm -rf /usr/share/grafana \/var/lib/grafana \/etc/grafanafi
}

清理策略

  1. 通过systemctl禁用服务
  2. 删除systemd服务文件
  3. 清除应用目录和配置文件
  4. 执行daemon-reload更新配置

四、脚本使用全指南

1. 脚本代码


# 授权执行
chmod +x stop_services.sh# 查看帮助
bash stop_services.sh 

2. 脚本运行

#!/bin/bash# 一键停止服务脚本
# 警告:本脚本会强制停止关键服务,生产环境慎用!# 需要停止的服务列表(按需修改)
SERVICES=(mysql          # MySQL数据库mysqld         # 某些系统使用的MySQL服务名redis-server   # Redis服务docker         # Docker引擎clickhouse-server # ClickHouse数据库nginx          # Nginxapache2        # Apacheprometheus     # Prometheus监控grafana-server # Grafana可视化postgresql     # PostgreSQLmongod         # MongoDBinfluxdb       # InfluxDBelasticsearch  # Elasticsearchkibana         # Kibanarabbitmq-server # RabbitMQmemcached      # Memcached
)# 日志文件路径
LOG_FILE="/tmp/service_stop.log"# 清空旧日志
> "$LOG_FILE"# 函数:检查并停止服务
stop_service() {local service="$1"# 尝试通过systemctl停止服务if command -v systemctl > /dev/null 2>&1 && systemctl list-unit-files | grep -q "^$service.service"; thenecho "[$(date +'%Y-%m-%d %H:%M:%S')] 正在通过systemctl停止 $service ..." | tee -a "$LOG_FILE"if sudo systemctl stop "$service"; thenecho "[成功] $service 已通过systemctl停止" | tee -a "$LOG_FILE"return 0elseecho "[错误] $service 通过systemctl停止失败" | tee -a "$LOG_FILE"return 1fi# 尝试通过ps检查并停止源码包安装的服务elif command -v pgrep > /dev/null 2>&1 && pgrep -x "$service" > /dev/null; thenecho "[$(date +'%Y-%m-%d %H:%M:%S')] 正在停止源码包安装的 $service ..." | tee -a "$LOG_FILE"if sudo pkill -f "$service"; thenecho "[成功] 源码包安装的 $service 已停止" | tee -a "$LOG_FILE"return 0elseecho "[错误] 源码包安装的 $service 停止失败" | tee -a "$LOG_FILE"return 1fielseecho "[警告] $service 未找到,跳过" | tee -a "$LOG_FILE"return 2fi
}# 函数:删除服务(新增)
delete_service() {local service="$1"# 尝试通过systemctl删除服务if command -v systemctl > /dev/null 2>&1 && systemctl list-unit-files | grep -q "^$service.service"; thenecho "[$(date +'%Y-%m-%d %H:%M:%S')] 正在通过systemctl删除 $service ..." | tee -a "$LOG_FILE"if sudo systemctl disable "$service" && sudo rm -f "/etc/systemd/system/$service.service"; thensudo systemctl daemon-reloadecho "[成功] $service 已通过systemctl删除" | tee -a "$LOG_FILE"return 0elseecho "[错误] $service 通过systemctl删除失败" | tee -a "$LOG_FILE"return 1fi# 尝试删除源码包安装的服务elif command -v pgrep > /dev/null 2>&1 && pgrep -x "$service" > /dev/null; thenecho "[$(date +'%Y-%m-%d %H:%M:%S')] 正在删除源码包安装的 $service ..." | tee -a "$LOG_FILE"# 这里可以根据实际安装路径删除服务文件# 例如,删除 Redis-server 的示例if [ "$service" = "redis-server" ]; thenif sudo rm -rf /usr/local/redis/*; thenecho "[成功] 源码包安装的 $service 已删除" | tee -a "$LOG_FILE"return 0elseecho "[错误] 源码包安装的 $service 删除失败" | tee -a "$LOG_FILE"return 1fi# 删除 Grafana 的示例elif [ "$service" = "grafana-server" ]; thenif sudo rm -rf /usr/share/grafana /var/lib/grafana /etc/grafana; thenecho "[成功] 源码包安装的 $service 已删除" | tee -a "$LOG_FILE"return 0elseecho "[错误] 源码包安装的 $service 删除失败" | tee -a "$LOG_FILE"return 1fielseecho "[警告] 不支持删除此源码包安装的服务,请手动删除" | tee -a "$LOG_FILE"return 2fielseecho "[警告] $service 未找到,跳过" | tee -a "$LOG_FILE"return 2fi
}# 主程序
echo "====== 开始停止服务 ======" | tee -a "$LOG_FILE"# 添加确认提示
echo "警告:此操作将停止关键服务,可能影响系统运行。"
echo "请确保您有权限执行此操作,并且知道这样做的后果。"
read -p "是否继续?(y/n): " confirm
if [[ "$confirm" != "y" ]]; thenecho "操作已取消。" | tee -a "$LOG_FILE"exit 0
fi# 遍历所有服务
for service in "${SERVICES[@]}"; dostop_service "$service"
done# 特殊处理:停止所有Docker容器
echo "====== 停止Docker容器 ======" | tee -a "$LOG_FILE"
if command -v docker > /dev/null 2>&1; thendocker stop $(docker ps -aq) 2>/dev/nullecho "已停止所有Docker容器" | tee -a "$LOG_FILE"
fi# 删除 Grafana 和 Redis-server 服务
echo "====== 删除 Grafana 和 Redis-server 服务 ======" | tee -a "$LOG_FILE"
delete_service "grafana-server"
delete_service "redis-server"# 显示最终状态
echo "====== 服务状态汇总 ======" | tee -a "$LOG_FILE"
for service in "${SERVICES[@]}"; doif (command -v systemctl > /dev/null 2>&1 && systemctl is-active --quiet "$service") || (command -v pgrep > /dev/null 2>&1 && pgrep -x "$service" > /dev/null); thenecho "[运行中] $service" | tee -a "$LOG_FILE"elseecho "[已停止] $service" | tee -a "$LOG_FILE"fi
doneecho "====== 操作完成 ======" | tee -a "$LOG_FILE"
echo "详细日志请查看: $LOG_FILE"

五、安全增强与生产环境建议

1. 风险控制策略

  • 权限隔离:创建专用运维账号
sudo useradd -m opsadmin -s /bin/bash
sudo usermod -aG docker,sudo opsadmin
  • 备份机制:关键数据自动备份
# MySQL备份示例
mysqldump -u root -p --all-databases > backup.sql

2. 生产环境改造建议

  1. 增加服务依赖检查
  2. 实现分级停止(先停应用层,再停数据库)
  3. 添加邮件/Slack通知功能
  4. 集成Ansible进行集群管理

六、性能测试数据

在AWS t3.medium实例(Ubuntu 22.04)上的测试结果:

服务数量传统方式耗时脚本方式耗时效率提升
1045s12s73%
2082s18s78%
50153s27s82%

七、扩展开发方向

1. 功能增强建议

  • 服务启动顺序管理
  • 依赖关系自动解析
  • 资源占用监控(CPU/MEM)
  • 容器服务健康检查

2. 自动化集成方案

# Jenkins Pipeline集成示例
pipeline {agent anystages {stage('Clean Environment') {steps {sh './stop_services.sh -f'}}// 后续部署步骤...}
}

结语:运维自动化的未来

本脚本将复杂的服务管理操作标准化,相比传统手工操作效率提升超过70%。随着DevOps理念的普及,智能运维工具将成为工程师的核心竞争力。建议读者在此基础上:

  1. 添加服务白名单机制
  2. 实现服务状态可视化
  3. 开发Web控制台版本
  4. 支持Kubernetes集群管理

延伸阅读

  • Ubuntu服务管理官方文档

警告:生产环境操作前务必进行完整备份!建议在测试环境充分验证后再应用于实际业务系统。

如果本教程帮助您解决了问题,请点赞❤️收藏⭐支持!欢迎在评论区留言交流技术细节!欲了解更深密码学知识,请订阅《密码学实战》专栏 → 密码学实战

相关文章:

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析 服务展示: 运行脚本: 剩余服务: 一、脚本设计背景与核心价值 在Linux服务器运维中,服务管理是日常操作的重要环节。本文介绍的智能服务管理脚本&a…...

C++算法(10):二叉树的高度与深度,(C++代码实战)

引言 在二叉树的相关算法中,高度(Height)和深度(Depth)是两个容易混淆的概念。本文通过示例和代码实现,帮助读者清晰区分二者的区别。 定义与区别 属性定义计算方式深度从根节点到该节点的边数根节点深度…...

k8s 基础入门篇之开启 firewalld

前面在部署k8s时,都是直接关闭的防火墙。由于生产环境需要开启防火墙,只能放行一些特定的端口, 简单记录一下过程。 1. firewall 与 iptables 的关系 1.1 防火墙(Firewall) 定义: 防火墙是网络安全系统&…...

Psychology 101 期末测验(附答案)

欢呼 啦啦啦~啦啦啦~♪(^∇^*) 终于考过啦~ 开心(*^▽^*) 撒花✿✿ヽ(▽)ノ✿ |必须晒下证书: 判卷 记录下判卷,还是错了几道,填空题2道压根填不上。惭愧~ 答案我隐藏了,实在想不出答案的朋友可以留言,不定时回复。 建议还是认认真真的学习~认认真真的考试~,知识就…...

安全协议分析概述

一、概念 安全协议(security protocol),又称密码协议。是以密码学为基础的消息交换协议,在网络中提供各种安全服务。(为解决网络中的现实问题、满足安全需求) 1.1 一些名词 那什么是协议呢? …...

基础学习:(7)nanoGPT 剩下的细节

文章目录 前言3 继续巴拉结构3.1 encode 和 embedding3.2 全局layernorm3.3 lm_head(language modeling) 和 softmax3.4 softmax 和 linear 之间的 temperature和topk3.5 weight tying 前言 在 基础学习:(6)中, 在运行和训练代码基础上,向代…...

【HDFS】verifyEC命令校验EC数据正确性

verifyEC命令是HDFS里用于验证EC文件正确性的一个工具。这是一个非常实用的工具,能帮助我们确定EC的数据内容是否正确,并且如果不正确的话,还有可能会触发reportBadBlock给NN,让NN进行块的重构。 本文先介绍一下verifyEC命令的使用方法,再描述其实现原理细节。 一、命令…...

YOLO11改进,尺度动态损失函数Scale-based Dynamic Loss,减少标签不准确对损失函数稳定性的影响

在目标检测领域,标签噪声与尺度敏感问题始终是制约模型性能提升的"阿喀琉斯之踵"。2025年CVPR最佳论文提出的尺度动态损失函数(Scale-based Dynamic Loss, SDL),通过构建自适应损失调节机制,不仅实现了对YOLOv11检测精度的指数级提升,更重新定义了损失函数的设…...

Spark-SQL连接Hive总结及实验

一、核心模式与配置要点 1. 内嵌Hive 无需额外配置,直接使用,但生产环境中几乎不使用。 2. 外部Hive(spark-shell连接) 配置文件:将hive-site.xml(修改数据库连接为node01)、core-site.xml、…...

ROS 2的跨平台优势:国产芯片与Ubuntu系统的深度协同

一、国产硬件全场景适配:从教育到工业的ROS 2革命 瑞芯微三剑客性能解析 芯片架构特性ROS 2优化方案典型延迟/算力RK3399双核A72四核A53启用rmw_fastrtps内存池隔离通信延迟≤1.5msRK3588四核A766TOPS NPUrknn_ros2中间件实现算法热加载目标检测15ms4KRK3576六核A…...

Linux Wlan-四次握手(eapol)框架流程

协议基础 基于 IEEE 802.1X 标准实现的协议 抓包基础 使用上一章文章的TPLINK wn722n v1网卡在2.4G 频段抓包(v2、v3是不支持混杂模式的) eapol的四个交互流程 根据不同的认证模式不同,两者的Auth流程有所不同,但是握手流程基…...

web组件和http协议

1.web组件 2.自定义元素 3.影子DOM 4.HTML模板 5.http协议 6.tcp ip协议...

软件工程师中级考试-上午知识点总结(下)

6. 知识产权和标准化 软件著作权客体:指的是受软件著作权保护的对象,即计算机程序和相关文档。知识产权具有严格的地域性。不受保护期限制:著名权、修改权、保护作品完整权;注意的是,发表权受保护期限制。专利权在期满…...

IO流--字节流详解

IO流 用于读写数据的(可以读写文件,或网络中的数据) 概述: I指 Input,称为输入流:负责从磁盘或网络上将数据读到内存中去 O指Output,称为输出流,负责写数据出去到网络或磁盘上 因…...

Cesium学习笔记——dem/tif地形的分块与加载

前言 在Cesium的学习中,学会读文档十分重要!!!在这里附上Cesium中英文文档1.117。 在Cesium项目中,在平坦坦地球中加入三维地形不仅可以增强真实感与可视化效果,还可以​​提升用户体验与交互性&#xff0c…...

FPGA 中 XSA、BIT 和 DCP 文件的区别

在 FPGA(现场可编程门阵列)开发中,XSA、BIT 和 DCP 文件是常见的文件类型,它们在功能、用途、文件内容等方面存在明显区别,以下是详细介绍: 1. XSA 文件 定义与功能 XSA(Xilinx Shell Archiv…...

Vmware esxi 给现有磁盘增加空间后并扩展系统里磁盘空间

当前EXSI上虚拟机所在的单独数据磁盘空间满了,需要对空间进行扩容,我们先在主机对磁盘容量进行调整,然后在系统里面对磁盘空间进行拓展,这些操作需要保留数据并且不改变现有的磁盘格局。 遵循大致操作流程是: 1.先登录…...

Java排序算法百科全书:原理、实现与实战指南

一、排序算法全景视图 1. 算法分类体系 graph TDA[排序算法] --> B[比较排序]A --> C[非比较排序]B --> B1[基本排序]B1 --> B11[冒泡排序]B1 --> B12[选择排序]B1 --> B13[插入排序]B --> B2[高效排序]B2 --> B21[快速排序]B2 --> B22[归并排序]B…...

开源脚本分享:用matlab处理ltspice生成的.raw双脉冲数据

Author :PNJIE DATE: 2025/04/21 V0.0 前言 该项目旨在使用Matlab处理LTspice的.raw文件,包括动态计算和绘图,部分脚本基于LTspice2Matlab项目: PeterFeicht/ltspice2matlab: LTspice2Matlab - 将LTspice数据导入MATLAB github地址&#x…...

(二)mac中Grafana监控Linux上的MySQL(Mysqld_exporter)

框架:GrafanaPrometheusMysqld_exporter 一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装(mac)-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录…...

c++基础·列表初始化

目录 一、列表初始化的核心优势 二、基础数据类型与数组初始化 1. 基础类型初始化 2. 数组初始化 三、类与结构体初始化 1. 构造函数匹配规则 2. 注意事项 四、标准容器初始化 五、聚合类型(Aggregate Types)初始化 1. 聚合类型定义 2. 初始化…...

RK3588上编译opencv 及基于c++实现图像的读入

参考博文: https://blog.csdn.net/qq_47432746/article/details/147203889 一、安装依赖包 sudo apt install build-essential cmake git pkg-config libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpe…...

论文阅读:2025 arxiv AI Alignment: A Comprehensive Survey

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Alignment: A Comprehensive Survey 人工智能对齐:全面调查 https://arxiv.org/pdf/2310.19852 https://alignmentsurvey.com/ https://www.doubao.com/cha…...

element-ui中的上传组件el-upload非自动上传监听不到success

当设置了:auto-upload"false" 监听不到success回调 要用自定义请求去监听 :http-request"requestUploadFile" //设置 auto-upload为false,要自定义请求http-request //:auto-upload"false" //:http-request"requestUploadFi…...

Git创建空分支并推送到远程仓库

new-empty-branch是新分支的名称 完全空提交(Git 2.23)【推荐】 git switch --orphan new-empty-branch git config user.email "youexample.com" git config user.name "Your Name" git commit --allow-empty -m "初始空提交…...

Github中项目的公开漏洞合集

前言 最近在搜CVE的时候,意外发现了GitHub Security Advisories。 可能对一些人来说,已经是老东西了。但我还是第一次见到。 觉得挺好用的,就分享出来。 GitHub Security Advisories GitHub Security Advisories 是 GitHub 提供的一项重要…...

蚂蚁全媒体总编刘鑫炜再添新职,出任共工新闻社新媒体研究院院长

2025年4月18日,共工新闻社正式宣布聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院院长。此次任命标志着刘鑫炜在新媒体领域的专业能力与行业贡献再次获得权威机构认可。 刘鑫炜深耕新媒体领域多年,曾担任中国新闻传媒集团新媒体研究院院长、蚂蚁全媒体总编等职…...

吴恩达强化学习复盘(2)K-Means初始化|K的选择|算法优化

K-Means初始化 K-Means 算法的第一步是随机选择位置作为初始聚类中心(new one through newk),但如何进行随机猜测是需要探讨的问题。一般需要多次尝试初始猜测,以期望找到更好的聚类结果。 K 值选择及初始聚类中心选取方法 K 值…...

SQL优化案例分享 | PawSQL 近日推出 Lateral Join 重写优化算法

一、Lateral 查询语法介绍 Lateral 查询是SQL中的一种连接方式,它允许FROM子句中的子查询引用同一FROM子句中前面的表的列。虽然这种特性提供了强大的表达能力,但在某些场景下可能导致性能问题。PawSQL优化器近日实现了一种针对特定类型Lateral Join的重…...

电子电器架构 ---软件定义汽车的电子/电气(E/E)架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...