似乎每当我尝试禁用 systemd 服务时,该服务都会找到某种方法来重新启用自己。最近的例子是 PackageKit,我发现它是我在这个问题中提出的问题的根源。如果我运行这个:
systemctl disable packagekit
然后几天我的磁盘保持稳定,但几天后,PackageKit 重新启用,运行,/var/cache/yum
再次填充,将我的磁盘固定在 100%。
我不是专门询问 PackageKit。真的,我想了解 systemd 服务停用应该如何工作。
是否有任何通用的方式来表示“禁用此服务,并禁用任何自动重新启用它的方式?” 还是我唯一的选择是彻底删除我不想运行的包?
更新:我的部分问题被误导了:systemctl disable
确保服务无论如何都不会运行不是我们的工作;所做systemctl disable
的只是说该服务不应该在启动时自动运行。
根据 user1686 的回答中的建议,我尝试了
busctl --activatable | grep -i packagekit
并得到
org.freedesktop.PackageKit - - - (activatable) - -
所以这很可能表明是什么事情开始了(如果不是在启动时)。busctl tree
但在继续下一步之前,我没想过要尝试。
再次根据 user1686 的建议,我尝试了
systemctl mask packagekit
这似乎起到了作用——无论以前启动过什么,现在都不再启动了。我不知道这是否会被视为丑陋、暴力或危险的解决方案;我不知道它是否会永远有效,但它似乎现在有效。
在 systemd 中“禁用”服务主要等同于其他 init 系统中的“从运行级别删除”(它从“multi-user.target”依赖树中删除服务)。大多数情况下,这意味着该服务将不再在引导期间显式启动。
但这并不意味着该服务不能以其他方式启动——例如,您仍然可以手动
systemctl start
禁用服务,就像您/etc/init.d/foo start
过去那样。一些服务被设置为以比简单的“启动时”更间接的方式启动,但在系统仍在启动时仍可能触发其启动:
它们可能作为某个其他服务的显式依赖项启动。如果该其他服务恰好在启动时启动,则该服务也将启动。
尝试
systemctl list-dependencies --reverse <unit>
看看是否有任何东西想要或需要该服务。他们可能有一个关联的
.socket
单元,一旦客户端尝试连接,就会“按需”启动服务。(如果在引导期间有连接尝试,它肯定看起来服务是“在引导时”启动的。)服务
systemctl status
应该显示它是否被套接字或计时器单元激活——这些单元也可以被停止和禁用。与按需套接字激活类似,服务可能会被试图通过消息总线与其对话的程序“激活”。(例如,packagekitd 可能会启动,因为 gnome-software 试图在您登录时对其进行查询。)
通常此类服务具有“systemctl disable”删除的别名,以防止对已禁用服务进行不必要的 D-Bus 激活——但这并不总是正确实施。1
但是,除此之外,systemd 不会自动启用您已禁用的单元。如果您看到一个单元再次显式启用(例如,内部的符号链接
multi-user.target.wants
已重新创建),那么它一定是由外部触发的。一些发行版使用 systemd预设来根据其整体策略重新启用或重新禁用单元,方法是在
systemctl preset
每次更新某些相关包时调用。(请参阅systemd.preset手册页。)如果您创建一个告诉 systemctl 始终禁用该服务的自定义预设,它将覆盖发行版的策略:systemctl enable
某些发行版在其升级后脚本中直接调用硬编码。在这种情况下,屏蔽该单元将使 systemd 的行为就好像它根本不存在一样——它不能再被启用、启动或以其他方式触摸:你的发行版的包管理器也可以选择跳过完全提取某些文件,这样就 systemd 而言它们实际上不再存在 - 例如 pacman:
D-Bus 激活
1如果您的服务在 中列出
busctl --activatable
,请尝试busctl tree
在其总线名称上使用 eg,看看这是否会使服务启动。如果与 org.freedesktop.PackageKit1(或任何名称)交谈确实导致禁用的 systemd 服务启动,这通常意味着 D-Bus
.service
文件指向错误的 systemd.service
文件(是的,这些是不同的东西),或者不是完全指向 systemd 服务(导致 dbus-daemon 直接生成服务)。在前一种情况下,您可以屏蔽 systemd .service 并且 dbus-daemon 将不再能够启动它。在后一种情况下,您必须通过覆盖 D-Bus .service
/usr/local/share/dbus-1
或让您的包管理器根本不提取它(因为 dbus-daemon 没有启用/禁用的等效项,也没有屏蔽/取消屏蔽) .因为当这样的事情发生时我讨厌它,所以我卸载了应用程序并销毁了安装媒体,因此无法重新安装。
我绝不会保留那些不告诉我它们所做的一切的应用程序,它们可能包括在你的系统中安装其他未知的东西,比如木马或后门,他们也没有提到。
我会卸载它以确保他们无法进行更新以取消您的解决方法。当应用程序不存在时,更新也不存在。