AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 516925
Accepted
peterh
peterh
Asked: 2019-05-04 02:24:17 +0800 CST2019-05-04 02:24:17 +0800 CST 2019-05-04 02:24:17 +0800 CST

如何让 systemd 在启动时不启动系统服务?

  • 772

我不想删除该服务,我只想避免它在启动时启动。我仍然需要稍后手动启动它的选项(使用systemctl start <service>命令)。

我尝试使用systemctl disable <service>. 它不起作用,因为它删除了服务。

还有另一种可能。在其服务文件中,

[Install]
#WantedBy=multi-user.target

可以被注释掉(然后,systemctl daemon-reload)。它适用于我自己的服务,因为他们的服务文件是由我编写的。

但是,属于分发的服务文件位于/lib/systemd/system. 此目录中的文件由操作系统管理,即它们将被更新覆盖,系统的其他部分可能会假定这些文件未修改,等等。简单地编辑系统文件/etc是一种不好的做法,我不想这样做。我不想在我的/lib.

该怎么办?

systemd
  • 2 2 个回答
  • 27458 Views

2 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2019-05-04T03:15:51+08:002019-05-04T03:15:51+08:00

    systemctl disable是这样做的正确方法;它仍然允许手动启动一个单元,即使它没有出现在systemctl --all的输出中——要列出所有可启动的单元,你应该运行它systemctl list-unit-files。要使单元无法启动,您需要mask它。

    $ sudo systemctl stop unbound
    $ sudo systemctl status unbound
    ● unbound.service - Unbound DNS server
       Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)
       Active: inactive (dead) since Fri 2019-05-03 13:12:41 CEST; 5s ago
         Docs: man:unbound(8)
     Main PID: 5320 (code=exited, status=0/SUCCESS)
    
    $ sudo systemctl disable unbound
    $ sudo systemctl status unbound
    ● unbound.service - Unbound DNS server
       Loaded: loaded (/lib/systemd/system/unbound.service; disabled; vendor preset: enabled)
       Active: inactive (dead)
         Docs: man:unbound(8)
    
    $ sudo systemctl start unbound
    $ sudo systemctl status unbound
    ● unbound.service - Unbound DNS server
       Loaded: loaded (/lib/systemd/system/unbound.service; disabled; vendor preset: enabled)
       Active: active (running) since Fri 2019-05-03 13:13:14 CEST; 1s ago
         Docs: man:unbound(8)
      Process: 30513 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)
      Process: 30518 ExecStartPre=/usr/lib/unbound/package-helper root_trust_anchor_update (code=exited, status=0/SUCCESS)
     Main PID: 30525 (unbound)
        Tasks: 1 (limit: 4915)
       CGroup: /system.slice/unbound.service
               └─30525 /usr/sbin/unbound -d
    

    如果你真的想要,你可以通过在 中/lib添加文件来覆盖定义的系统提供的服务/etc,并更改它们所需的目标;systemctl edit yourunit会做正确的事:它会打开一个编辑器,允许您仅覆盖您关心的设置,并将结果存储在正确的位置,作为覆盖“片段”。对系统提供的服务中的非覆盖设置的更新(例如通过包升级)将被透明地考虑在内。

    • 34
  2. kkm
    2021-03-01T04:46:53+08:002021-03-01T04:46:53+08:00

    我没想到会写这么长的答案,但是您似乎一直在尝试使用 systemd 做不同的事情,而且我假设您对它的机制更感兴趣,而不是仅仅输入一次魔术命令并忘记它的存在。而且我可以谈论 systemd 更多、更长的时间!

    我。

    当您作为管理员想要禁用服务启动或启用时,Stephen Kitt 的回答从管理的角度来看非常好且详尽(我很乐意对其进行投票) 。正如 systemd 文档 v241 所说(参见 参考资料man 5 systemd.unit):

    如果单元文件为空(即文件大小为 0)或符号链接到/dev/null,则不会加载其配置并显示为“屏蔽”的加载状态,并且无法激活。使用它作为完全禁用单元的有效方法,即使手动启动它也是不可能的。

    systemctl mask正是这样做的:它创建一个与下面的单元同名的/etc符号链接,并将服务文件符号链接到/dev/null. 由于 systemd/etc首先查找(顺序在同一手册中的第一行给出),并找到命名的单元,它发现该单元被屏蔽了。它就是为此而设计的,如果您想阻止服务被启用和启动,请使用它。这是最简单的单命令解决方案,可以在重新启动后继续存在。保持简单可以做的事情简单。

    二、

    但是,如果您正在设计一组相互依赖的服务,以系统构建者而不是管理员的角色,使用systemctl命令声明服务不可启动或不可停止,同时仍然允许其他机制(套接字,dbus等)按需启动它。为此,systemd 具有设置,也在同一手册中进行了描述:RefuseManualStart=和RefuseManualStop=:

    接受一个布尔参数。如果为 true,则只能间接激活或停用该单位。在这种情况下,用户请求的显式启动或终止将被拒绝,但是如果它作为另一个单元的依赖项启动或停止,则启动或终止将成功。这主要是一种安全功能,可确保用户不会意外激活不打算明确激活的单元,也不会意外停用不打算停用的单元。这些选项默认为 false。

    您可以启用这样的服务,但它会拒绝启动systemctl start(或停止,对于其他设置),以防止操作员错误。

    三、

    [Install]根据您在服务文件中评论该部分的想法提出的要详细说明的一点:

    [Install]
    #WantedBy=multi-user.target
    

    如果系统自带服务,即当单元文件位于层次结构下的某个位置时,请不要这样做/lib!升级将静默覆盖它,或要求您手动干预以合并更改。systemd 对此有更好的机制。按照惯例(对于系统服务),systemd 的目录/etc是“你的”,但下面的目录/lib属于发行版。

    例如,如果您想WantedBy=从该部分中删除该子句[Install],则应使用 systemd 适当的机制对服务进行少量调整:使用 command sudo systemctl edit servicename.service。systemd 将为您打开一个编辑器,最初该文件将为空。

    systemd 的下一个有用的属性是,当关键字值是一个列表(例如WantedBy)时,为其分配一个空字符串会重置列表(不同版本存在不一致,但大多数情况下它都有效。在我们的例子中它确实)。在编辑器中,您添加两行(这只是对您尝试但尚未完全达到工作解决方案的概念的详细说明;我们已经知道您将通过屏蔽来实现您想要的):

    [Install]
    WantedBy=
    

    这会将WantedBy列表重置为空。如果您想添加另一个依赖项,只需将另一行与相同的键(另一个WantedBy=another.service,在我们考虑不周的示例中)。在幕后实际发生的情况是,systemd在i下创建了一个覆盖文件。/etce. 在您的机器所有者的目录中,并承诺永远不会碰它。假设默认目录布局,systemd 创建的文件名为/etc/systemd/system/servicename.service.d/override.conf. 这里的部分servicename.service正是您要覆盖的单元名称。systemd 尊重这个新子目录中的所有文件,因此可以不只是override.conf; 只需要注意它们将按名称的字典顺序应用,最低的在前(如ls -1 *.conf | LC_ALL=C sort将显示的那样)。

    虽然在您的情况下不是正确的机制,正如彼得已经在后续评论中回答的那样,但有时在您想要添加环境变量或什至解决错误时它会有所帮助¹,例如

    $ cat /etc/systemd/system/systemd-remount-fs.service.d/override.conf
    # Workaround for the systemd bug #14603: remount-fs and growfs@
    # race, so that the latter may fail because the root fs is still
    # readonly. This dependency ensures that the remount happens first.
    [Unit]
    [email protected]
    

    systemctl show 您可以使用myunit.service验证您的覆盖是否已合并到单元配置中。它的输出非常冗长,所以使用 grep:

    $ systemctl show systemd-remount-fs.service | grep ^Before=
    Before=systemd-update-utmp.service [...] [email protected] [...]
    

    这不是世界上最清晰的例子,因为这条线很长;[...]我在标记所在的位置删除了大部分内容,但您可以[email protected]在列表中找到。即使在尝试不同的启动/停止/启动/休眠和其他方案之前,始终验证配置更改是否确实将其纳入单元的组合设置是一个很好的做法。发生拼写错误。

    四。

    自然地,您可以调整任何类型的单元,不仅是服务:计时器、套接字、挂载等。甚至在目录下动态生成/run的单元文件也尊重这些调整。例如,尽管在以下情况下,/opt挂载是使用常规挂载的,但 systemd会在内存文件系统目录中为其/etc/fstab生成一个临时单元。这个临时单元完全识别. 而且,顺便说一下,它想要的服务是正确使用and的一个例子:它应该只在文件系统挂载和卸载时完成它的工作,如果手动启动它会挂起或吐出错误。更糟糕的是,它opt.mount/run/systemd/systemWants=/etc/systemd/systemRefuseManualStartRefuseManualStop/opt/opt如果文件系统已经被手动启动,它就不会在文件系统安装后启动!

    BindsTo=opt.mount该服务还通过同时指定和来显示“强绑定”模式After=opt.mount。引用 systemd.unit(5) 手册,在“[UNIT] SECTION OPTIONS/BindsTo=" 下,在括号中添加我的内容以使语言更易于理解:

    当在同一个 unit[,] 上与 After= 结合使用时,BindsTo= 的行为更加强大。在这种情况下,绑定到 [必须] 的单元 [必须] 处于活动状态,以便该单元也 [并保持] 处于​​活动状态。

    这里的含义是,该单元在停止之后启动并在停止之前opt.mount停止,以紧密的步调一致。

    * * *

    systemd 是一个大型、强大且灵活的系统,如果您在以最佳方式调整系统之后,man当您对其他事情感到厌烦时,在 Web 上或 Web 上阅读它的文档肯定是有益的。


    ¹ 一年多以前,该错误已被修复,并且该修复已进入 systemd 的 245 版,但由于我正在部署一系列不同的发行版,有时还会从旧映像中汇总 VM,因此我必须保持一会儿。Debian 10 有一个 systemd 的前缀 v241;只有 Debian 11 带有 v247。生产系统升级缓慢,因此解决方法是多停留几年。

    • 14

相关问题

  • journalctl 中的区分级别

  • 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _

  • systemd:如何在服务启动时运行脚本,而不编辑服务定义

  • 使用 systemd 看门狗支持重新启动应用程序

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve