我正在尝试使用 来屏蔽一项服务sudo systemctl mask expressvpn.service
,并且输出结果为Failed to mask unit: File /etc/systemd/system/expressvpn.service already exists.
。
我尝试过这些解决方案:
sudo systemctl unmask expressvpn.service
然后sudo systemctl mask expressvpn.service
。它不起作用。- 文件
file /etc/systemd/system/expressvpn.service
并输出/etc/systemd/system/expressvpn.service: ASCII text
。这表明该文件不是符号链接。 sudo ln -s /dev/null /etc/systemd/system/expressvpn.service
并输出ln: failed to create symbolic link '/etc/systemd/system/expressvpn.service': File exists
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”脚本安装的,最佳做法是不要使用此类脚本。