Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux删除Systemd服务

Linux删除Systemd服务的完整步骤

作者:Arvin627

本文介绍了如何停止、禁用、删除systemd服务,包括停止服务、禁用服务、删除服务文件、重新加载Systemd配置以及验证服务已删除等步骤,同时,还强调了检查服务状态、清理日志等注意事项,需要的朋友可以参考下

一、概述

在 Linux 系统运维中,删除不再使用的 systemd 服务是一项常见但需要谨慎执行的操作。不规范的服务删除可能导致系统配置混乱、资源占用或依赖问题。

本文以删除名为 auth 的 systemd 服务为例,系统讲解服务删除的完整流程,包括停止、禁用、删除文件、重载配置、清理日志以及故障恢复等环节。

适用场景

二、操作前准备

2.1 确认服务状态

在删除服务之前,必须先确认服务的当前状态,避免误操作:

# 查看服务详细状态
sudo systemctl status auth.service
sudo systemctl status auth.socket
# 查看服务是否开机自启
sudo systemctl is-enabled auth.service
sudo systemctl is-enabled auth.socket
# 列出所有包含 auth 的单元文件
sudo systemctl list-unit-files | grep -i auth

2.2 检查服务依赖关系

某些服务可能被其他服务依赖,直接删除可能导致依赖服务异常:

# 查看哪些服务依赖 auth.service
sudo systemctl list-dependencies --reverse auth.service
# 查看 auth.service 依赖哪些其他服务
sudo systemctl list-dependencies auth.service

2.3 记录服务配置(可选但推荐)

建议在删除前备份服务文件,便于后续恢复或审计:

# 创建备份目录
sudo mkdir -p /root/systemd_backup
# 备份服务文件
sudo cp /etc/systemd/system/auth.service /root/systemd_backup/
sudo cp /etc/systemd/system/auth.socket /root/systemd_backup/
# 记录服务配置摘要
sudo systemctl show auth.service > /root/systemd_backup/auth.service.txt

三、服务删除操作步骤

3.1 停止服务

首先停止正在运行的服务及其关联的 socket:

# 停止认证服务(如果服务正在运行)
sudo systemctl stop auth.service
# 停止 socket 监听(如果存在)
sudo systemctl stop auth.socket

注意事项

  • 停止服务前,建议通知相关业务方或确认没有正在处理的请求
  • 如果服务停止失败,使用 sudo systemctl kill auth.service 强制终止

3.2 禁用服务(防止开机自启)

停止服务后,需要禁用服务,防止系统重启时自动启动:

# 禁用服务
sudo systemctl disable auth.service
sudo systemctl disable auth.socket

执行后,系统会删除 /etc/systemd/system/multi-user.target.wants/ 等目录中的软链接。

3.3 删除服务文件

确认服务已停止并禁用后,删除服务单元文件:

# 删除服务文件
sudo rm -f /etc/systemd/system/auth.service
sudo rm -f /etc/systemd/system/auth.socket
# 如果存在覆盖文件(override 配置),一并删除
sudo rm -rf /etc/systemd/system/auth.service.d/
sudo rm -rf /etc/systemd/system/auth.socket.d/

说明:*.d 目录存放服务的覆盖配置(drop-in 文件),通常通过 systemctl edit auth.service 生成。

3.4 重新加载 systemd 配置

删除服务文件后,需要通知 systemd 重新加载配置:

# 重新加载所有单元文件
sudo systemctl daemon-reload
# 重置失败状态(清理因服务停止产生的失败记录)
sudo systemctl reset-failed

3.5 验证服务已删除

执行以下命令确认服务已被彻底移除:

# 方式一:查看服务状态(应显示未找到)
systemctl status auth.service
systemctl status auth.socket
# 方式二:查看单元文件列表
systemctl list-unit-files | grep -i auth
# 方式三:检查服务文件是否还存在
ls -la /etc/systemd/system/auth*

预期输出

四、清理日志与残留数据(可选)

4.1 清理 journald 日志

删除服务后,相关日志记录仍然保留在 systemd journal 中。如果希望彻底清理:

# 查看服务相关日志大小
sudo journalctl --unit=auth.service --output=verbose | wc -c
# 仅清理特定服务的日志(需要 journald 版本 245+)
sudo journalctl --rotate --unit=auth.service
sudo journalctl --vacuum-time=1s --unit=auth.service
# 如果上述命令不支持,可以清理所有超过 1 天的日志(谨慎使用)
sudo journalctl --vacuum-time=1d

注意:--vacuum-time=1s 会立即删除该服务的所有日志,不可恢复。

4.2 清理运行时文件(如果有)

某些服务会在 /run/var/lib 或 /tmp 目录下创建运行时文件,需手动清理:

# 示例:清理常见运行时目录
sudo rm -rf /run/auth/
sudo rm -rf /var/lib/auth/
sudo rm -rf /var/log/auth*

具体路径取决于服务的实现,建议查阅服务文档或源码确认。

4.3 清理防火墙/端口映射(如适用)

如果服务绑定了特定端口且通过防火墙规则暴露,删除后应清理相关规则:

# 示例:查看是否有相关防火墙规则
sudo firewall-cmd --list-all
# 或
sudo iptables -L -n | grep -i auth

五、故障排查与恢复

5.1 删除后服务仍显示存在

现象:执行 systemctl status auth.service 仍能查看到服务信息

可能原因及解决方案

原因解决方案
服务文件存在于其他位置(如 /usr/lib/systemd/system/find /etc/systemd /usr/lib/systemd -name "*auth*" 查找并删除
systemd 未完全重载执行 sudo systemctl daemon-reload && sudo systemctl reset-failed
服务被 mask(屏蔽)了sudo systemctl unmask auth.service 后再删除

5.2 服务无法停止(卡住)

现象:执行 systemctl stop auth.service 命令长时间无响应

解决方案

# 1. 查看服务进程
sudo systemctl status auth.service
# 2. 强制终止服务
sudo systemctl kill --signal=SIGKILL auth.service
# 3. 如果仍然失败,找到进程并手动 kill
ps aux | grep auth
sudo kill -9 <PID>

5.3 误删服务如何恢复

如果误删了服务文件但尚未执行 daemon-reload

# 立即从备份恢复
sudo cp /root/systemd_backup/auth.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl start auth.service

如果已执行 daemon-reload 且无备份:

# 根据服务类型重新创建服务文件
# 或从包管理器重新安装对应软件包
sudo yum reinstall <package-name>      # CentOS/RHEL
sudo apt reinstall <package-name>      # Ubuntu/Debian

5.4 daemon-reload 后出现警告

现象:执行 systemctl daemon-reload 时提示某些文件引用不存在

解决方案

# 查看具体警告信息
sudo systemctl --state=bad
# 清理未使用的单元文件引用
sudo systemctl reset-failed

六、完整操作脚本(一键删除)

以下脚本整合了上述所有步骤,可作为参考:

#!/bin/bash
# systemd_service_remove.sh - 安全删除 systemd 服务
# 用法: sudo ./systemd_service_remove.sh auth
set -euo pipefail
SERVICE_NAME="${1:-}"
if [ -z "$SERVICE_NAME" ]; then
    echo "用法: $0 <service-name>"
    echo "示例: $0 auth"
    exit 1
fi
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
SOCKET_FILE="/etc/systemd/system/${SERVICE_NAME}.socket"
BACKUP_DIR="/root/systemd_backup/$(date +%Y%m%d_%H%M%S)"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo -e "${YELLOW}开始删除 systemd 服务: ${SERVICE_NAME}${NC}"
# 1. 检查服务是否存在
if ! systemctl list-unit-files | grep -q "^${SERVICE_NAME}\."; then
    echo -e "${RED}错误: 服务 ${SERVICE_NAME} 不存在${NC}"
    exit 1
fi
# 2. 创建备份
echo -e "${YELLOW}创建备份...${NC}"
mkdir -p "$BACKUP_DIR"
[ -f "$SERVICE_FILE" ] && cp "$SERVICE_FILE" "$BACKUP_DIR/"
[ -f "$SOCKET_FILE" ] && cp "$SOCKET_FILE" "$BACKUP_DIR/"
systemctl show "$SERVICE_NAME" > "$BACKUP_DIR/${SERVICE_NAME}.txt"
echo -e "${GREEN}备份已保存至: $BACKUP_DIR${NC}"
# 3. 检查依赖
echo -e "${YELLOW}检查反向依赖...${NC}"
DEPS=$(systemctl list-dependencies --reverse "$SERVICE_NAME" --no-legend 2>/dev/null | grep -v "^$SERVICE_NAME" || true)
if [ -n "$DEPS" ]; then
    echo -e "${YELLOW}警告: 以下服务依赖 ${SERVICE_NAME}:${NC}"
    echo "$DEPS"
    read -p "是否继续删除? (y/N): " confirm
    if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
        echo -e "${RED}操作已取消${NC}"
        exit 1
    fi
fi
# 4. 停止服务
echo -e "${YELLOW}停止服务...${NC}"
systemctl stop "${SERVICE_NAME}.service" 2>/dev/null || true
systemctl stop "${SERVICE_NAME}.socket" 2>/dev/null || true
# 5. 禁用服务
echo -e "${YELLOW}禁用服务...${NC}"
systemctl disable "${SERVICE_NAME}.service" 2>/dev/null || true
systemctl disable "${SERVICE_NAME}.socket" 2>/dev/null || true
# 6. 删除服务文件
echo -e "${YELLOW}删除服务文件...${NC}"
rm -f "$SERVICE_FILE"
rm -f "$SOCKET_FILE"
rm -rf "/etc/systemd/system/${SERVICE_NAME}.service.d"
rm -rf "/etc/systemd/system/${SERVICE_NAME}.socket.d"
# 7. 重载 systemd
echo -e "${YELLOW}重载 systemd 配置...${NC}"
systemctl daemon-reload
systemctl reset-failed
# 8. 验证删除
echo -e "${YELLOW}验证删除结果...${NC}"
if systemctl list-unit-files | grep -q "^${SERVICE_NAME}\."; then
    echo -e "${RED}错误: 服务 ${SERVICE_NAME} 仍然存在${NC}"
    exit 1
else
    echo -e "${GREEN}✅ 服务 ${SERVICE_NAME} 已成功删除${NC}"
fi
# 9. 日志清理提示
echo -e "${YELLOW}如需清理日志,请执行:${NC}"
echo "  sudo journalctl --vacuum-time=1s --unit=${SERVICE_NAME}.service"

脚本使用方法

# 1. 保存脚本
sudo vi /usr/local/bin/rm-systemd-service.sh
# 2. 赋予执行权限
sudo chmod +x /usr/local/bin/rm-systemd-service.sh
# 3. 执行删除
sudo /usr/local/bin/rm-systemd-service.sh auth

七、最佳实践总结

7.1 操作检查清单

步骤检查项状态
1确认服务名称正确
2备份服务文件和配置
3检查服务依赖关系
4通知相关业务方(生产环境)
5停止服务
6禁用服务
7删除服务文件
8重载 systemd
9验证服务已删除
10清理日志和残留文件

7.2 注意事项

7.3 常见命令速查

操作命令
查看服务状态systemctl status <service>
停止服务systemctl stop <service>
禁用服务systemctl disable <service>
重载配置systemctl daemon-reload
查看依赖systemctl list-dependencies <service>
查看反向依赖systemctl list-dependencies --reverse <service>
查看所有单元文件systemctl list-unit-files
清理失败状态systemctl reset-failed

八、总结

通过遵循本文的操作流程和最佳实践,可以安全、彻底地删除不再需要的 systemd 服务,避免因不规范操作导致的系统问题。

以上就是Linux删除Systemd服务的完整步骤的详细内容,更多关于Linux删除Systemd服务的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文