systemd 错误地将服务报告为屏蔽服务,但实际上并非如此

systemd 错误地将服务报告为屏蔽服务,但实际上并非如此

我正在尝试使用 来屏蔽一项服务sudo systemctl mask expressvpn.service,并且输出结果为Failed to mask unit: File /etc/systemd/system/expressvpn.service already exists.

我尝试过这些解决方案:

  1. sudo systemctl unmask expressvpn.service然后sudo systemctl mask expressvpn.service。它不起作用。
  2. 文件file /etc/systemd/system/expressvpn.service并输出/etc/systemd/system/expressvpn.service: ASCII text。这表明该文件不是符号链接。
  3. sudo ln -s /dev/null /etc/systemd/system/expressvpn.service并输出ln: failed to create symbolic link '/etc/systemd/system/expressvpn.service': File exists
  4. systemctl status expressvpn.service并输出Running

我不知道为什么会发生这种情况,我所能做的就是将服务重命名为另一个名称(例如expressvpn.service.old),并且它可以工作,但这个问题在另一个名为 anydesk 的程序和其他程序中也发生过几次。

那么简单来说,链接文件存储在哪里?如何在不重命名服务的情况下解决问题?

答案1

您无法屏蔽存储在 /etc 中的单元文件,因为它们位于完全相同的位置就像‘mask’符号链接将会到达的那样。

“mask”子命令的存在是为了使系统所有者能够覆盖由软件包安装到 /usr/lib 的单元 - 它使 systemd 假装该单元不存在,即使它确实存在。但如果原始单元实际上在 /etc 中,那么屏蔽它就毫无意义了:您可以直接将其删除以获得相同的结果。

  • 如果该设备是由您安装的,则只需重命名或删除它即可 - 它超出了“屏蔽”功能的范围。(但是,--runtime如果这确实是您想要的,屏蔽可能仍然有效?)
  • 如果该单元实际上是由 .deb 包安装的,那么应该修复该包以仅将文件安装到 /lib 或 /usr/lib。
  • 如果该单元是通过“~/Downloads/install-expressvpn.sh”脚本安装的,最佳做法是不要使用此类脚本。

相关内容