Systemd依赖关系和启动顺序


20

我需要指定启动顺序以启动进程。我在Fedora 18上运行389 Directory Server和Samba。如何启动网络服务,然后启动389 DS,然后启动Samba?在Fedora中是否有GUI可以对此进行管理?

我已启用Samba以开始systemctl enable smb.service。我还通过启用了389 DS systemctl enable dirsrv.target


Systemd不需要服务之间的顺序,其思想是并行启动所有内容,并在可用时将连接交给服务器。默认安装给出的配置应该可以。为什么您认为必须定义订单?某些东西行不通吗?
vonbrand

我还要注意,由于这种情况已经恢复,因此您实际上不应该在域控制器上运行文件/打印服务。
迈克尔·汉普顿

@vonbrand我遇到了这个问题,我的DHCP服务器需要拍打起来(因为它的配置存储在LDAP目录中)。如果不是,DHCP服务器将不会启动。

Answers:


25

使用systemctl edit smb.service更新的依赖关系。

After=dirsrv.target -将确保在dirsrv.target之后启动smb.service。

为了增强鲁棒性(如果您需要修改这些内容,这将是值得的),您可能还希望包括以下内容:

Requires=dirsrv.target-激活smb.service时激活dirsrv.target。如果dirsrv.target失败,将导致smb.service失败。

Wants=dirsrv.target-激活smb.service时激活dirsrv.target。如果dirsrv.target失败,则不会导致smb.service失败。

BindsTo=dirsrv.target -如果停用了dirsrv.target,请停用smb.service。

资料来源:http : //www.freedesktop.org/software/systemd/man/systemd.unit.html

systemd-ui提供systemd的GUI。可以很好地了解systemd的状态,但是您仍然必须使用文本编辑器来修改单元文件。


A要求B的情况下,会说“ B”“失败”,所以A将不会启动吗?B程序返回非零值吗?
John Wang

2
投反对票,因为这建议您作弊。/usr/lib/systemd除非您是发行版维护者,否则不要编辑单位文件的版本,否则在每次软件包更新时都会被覆盖。将单元文件复制到中/etc/systemd然后进行编辑,或者使用一个嵌入式文件(有关详细信息,请参见systemd.unit(5))。甚至更容易,只需使用systemctl edit smb.service自动执行插入文件魔术的功能即可!
Jeremy Visser

3
感谢您编辑答案!它解决了疑虑,我已转为赞成。:-)
杰里米·维瑟

10

做两件事:

  1. 编辑/lib/systemd/system/smb.service单元文件,以指定依赖性。本[unit]节包含After=一行,指定在此之前应达到的服务/目标。

    After=syslog.target network.target nmb.service winbind.service
    

    更改为:

    After=dirsrv.target syslog.target network.target nmb.service winbind.service
    
  2. 将此依赖项作为bug报告给Fedora,以便可以将其合并到将来的发行版中。


这似乎不起作用。Samba在389
。– Dylan Klomparens

3
修改unit文件后,通常应运行systemctl daemon-reload
scottyseus 2015年

2

您可能需要更改或 在文件部分的Requires指令中加入一行。[Unit]/usr/lib/systemd/system/smb.service

Requires=dirsrv.target

After=dirsrv.target

好吧,我对这个答案投了赞成票,但是,我个人会使用Wants = dirsrv.target而不是Requires =。(请参阅systemd.unit(5)以了解Wants =)
星系

2

在中修改服务文件有两种选择/usr/lib/systemd/system(请参见示例2。覆盖供应商设置):

  1. 将文件复制到/etc/systemd/system副本上并对其进行修改。该文件将完全覆盖中的文件 /usr/lib

  2. 创建文件/etc/systemd/system/smb.service.d/local.conf。该文件的内容应类似于以下示例。这有选择地覆盖了供应商提供的服务文件中的“ Requires”和“ After”选项。

每一个(包括在 /usr/lib)优点和缺点。最佳选择可能取决于服务和修改的性质。

尽管可能可行,但仅添加“ After”选项是不够的(请参阅[Unit]部分选项)。“之后”控制顺序,但不控制依赖关系。如果dirsrv.target未以其他方式启动,则指定订单不会启动它。使用“ Requires”或“ Wants”选项将被强制dirsrv.target启动。

[Unit]
Requires=dirsrv.target
After=dirsrv.target

注意:最初问这个问题时,我不知道这种方法是否可用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.