如何删除systemd服务

eme*_*mel 343 linux systemd

如果我安装了一个新服务,然后决定不再需要该应用程序并删除它,该服务仍会systemctl作为error列在输出中。

这是从哪里来的,我该如何彻底删除它们?

Mar*_*ata 534

我的服务消除秘诀(小心rm陈述!)

systemctl stop [servicename]
systemctl disable [servicename]
rm /etc/systemd/system/[servicename]
rm /etc/systemd/system/[servicename] # and symlinks that might be related
rm /usr/lib/systemd/system/[servicename] 
rm /usr/lib/systemd/system/[servicename] # and symlinks that might be related
systemctl daemon-reload
systemctl reset-failed
Run Code Online (Sandbox Code Playgroud)

systemd 服务可能将旧式脚本“包装”在 /etc/init.d 中,因此您可能也想清理它,但这不是systemd 服务所在的位置。

  • 请注意,Systemd 单元文件存储在多个位置,特别是`/usr/lib/systemd/system` 和`/etc/systemd/system/`。参考:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/chap-Managing_Services_with_systemd.html#tabl-Managing_Services_with_systemd-Introduction-Units-Locations (14认同)
  • 我还必须在运行 `systemctl reset-failed` 之前删除 `/etc/init.d/[servicename]` (14认同)
  • 是的,我在删除单元文件之前忘记禁用了。顺便说一句,为了找到所有要删除的单元文件,我检查了 `systemctl cat [servicename]` 的输出。 (11认同)
  • 那行得通,谢谢,但我不知道为什么我要手动清理这些垃圾。 (4认同)
  • @MarkLakata 为什么我们最后需要做`systemctl reset-failed`? (2认同)
  • 我想知道为什么 systemctl 不提供自动删除服务的接口,而不是手动查找文件并删除它们。 (2认同)
  • 我有一些在: `./etc/systemd/user/` 和 `./etc/systemd/user/multi-user.target.wants/` (2认同)
  • 尝试此操作的任何人可能都想运行 `find /usr/lib/systemd/system | grep "[服务名称]"` 和 `find /etc/systemd/system | grep "[servicename]" 查找对其服务的任何引用。我的服务隐藏在子文件夹“/etc/systemd/system/multi-user.target.wants/”中,我不知道还有多少其他服务子文件夹。 (2认同)

Veb*_*osa 53

您可能正在寻找reset-failed

$ sudo systemctl reset-failed
$
Run Code Online (Sandbox Code Playgroud)

从 systemd 手册页:

reset-failed [PATTERN...]

重置指定单元的“失败”状态,或者如果没有传递单元名称,则重置所有单元的状态。当一个单元以某种方式失败(即进程以非零错误代码退出、异常终止或超时)时,它会自动进入“失败”状态,并记录其退出代码和状态以供管理员自省,直到服务使用此命令重新启动或重置。

  • 我没有阅读 OP 的问题,但这是 **I** 正在寻找的答案。 (11认同)
  • 这根本不是问题的要求。这到底是为什么被点赞了 17 次? (8认同)
  • 这是唯一正确的答案。其他有更多赞成票和复选标记的是解决方法。 (4认同)
  • 这正是我所需要的。该服务显然已被删除,但失败状态仍然存在。 (2认同)
  • 听起来这只是重置了不应再存在的服务的状态。您很可能应该删除服务文件本身,而不是简单地更改您不再需要的服务的状态。 (2认同)

ner*_*ler 36

听起来你卸载了它,但没有删除 systemd 钩子:

# systemctl disable [servicename]


gar*_*ium 10

添加到@mark-lakata的答案并牢记rm命令所需的注意力。[chkconfig]可以简化这个过程!(点击这里阅读 chkconfig

要重新迭代命令列表:

  1. systemctl stop [servicename]
  2. chkconfig [servicename] off 或用于较新的系统 systemctl disable [servicename]
  3. systemctl daemon-reload
  4. systemctl reset-failed

注意:第一个命令是可选的,取决于您是否希望在当前会话中保持服务运行(对于这个问题,应该使用该命令)。

第二个命令负责禁用和删除(遵循符号链接)服务。

  • 好的,但我使用此命令的原因是,您不必显式运行 rm 命令 (3认同)
  • `chkconfig` 是启用/禁用 SysVinit 服务的原始命令。在使用 systemd 的系统中,它可能作为一个向后兼容命令出现;但是原生的 `systemctl` 命令同样简单:`systemctl disable [servicename]` (2认同)
  • `systemctl disable` 没有为我删除单元文件 (2认同)

小智 8

一个简单的 Oneliner 可以是:

service=YOUR_SERVICE_NAME; systemctl stop $service && systemctl disable $service && rm /etc/systemd/system/$service &&  systemctl daemon-reload && systemctl reset-failed
Run Code Online (Sandbox Code Playgroud)

设置service为您想要删除的服务。例如service=gunicorn.service


int*_*ika 6

从 systemd 中删除服务:

Systemd 使用单元(定义服务的文件)来删除必须删除的服务...以下是单元位置列表:

/etc/systemd/system/ (and sub directories)
/usr/local/etc/systemd/system/ (and sub directories)
~/.config/systemd/user/ (and sub directories)
/usr/lib/systemd/ (and sub directories)
/usr/local/lib/systemd/ (and sub directories)
/etc/init.d/ (Converted old service system)
Run Code Online (Sandbox Code Playgroud)

刷新系统:

systemctl daemon-reload
systemctl reset-failed
Run Code Online (Sandbox Code Playgroud)

幽灵服务(未找到):

Systemd 可以列出 Ghost(未找到)服务,即使该单元由于多种原因被删除

  1. 单元仍然存在于 systemd 目录之一
  2. 单元不退出,但文件链接仍然存在于 systemd 目录之一
  3. 该服务已在其他单位使用*

(*) 如果某个服务在其他单元中提到但不存在,即使没有单元文件,systemd 仍会列出该服务,状态为未找到...您可以通过文本搜索来搜索哪个单元正在使用该服务并编辑这些单元(如果您打算稍后安装该服务,则不推荐)


来源:Linuxhacks.org
披露:我是 Linuxhacks.org 的所有者