使用 systemd 来管理启动项 启动序列( 五 )


这是什么意思?查看链接/etc/system d/system/default . target..文件显示systemd首先启动了默认目标graphic . target,然后graphic . target触发了多用户. target..
[root@testvm1system]#catdefault.target#SPDX-License-Identifier:LGPL-2.1+##Thisfileispartofsystemd.##systemdisfreesoftware;youcanredistributeitand/ormodifyit#underthetermsoftheGNULesserGeneralPublicLicenseaspublishedby#theFreeSoftwareFoundation;eitherversion2.1oftheLicense,or#(atyouroption)anylaterversion.[Unit]Description=GraphicalInterfaceDocumentation=man:systemd.special(7)Requires=multi-user.targetWants=display-manager.serviceConflicts=rescue.servicerescue.targetAfter=multi-user.targetrescue.servicerescue.targetdisplay-manager.serviceAllowIsolate=yes[root@testvm1system]#无论服务是用graphical.target还是多用户. target启动,hello.service单元都会在启动后19.5秒或19.6秒启动 。基于这个事实和日志结果(尤其是输出单调的日志),您将知道这些目标是并行启动的 。看看日志里的另一件事:
[28.397330]testvm1.both.orgsystemd[1]:ReachedtargetMulti-UserSystem.[28.397431]testvm1.both.orgsystemd[1]:ReachedtargetGraphicalInterface.这两个目标几乎同时完成 。这和理论是一致的,因为图形化的. target触发了多用户. target,在多用户. target到来之前不会完成(也就是完成) 。但是hello.service完成得比这次早得多 。
这一切都说明这两个目标几乎是并行开始的 。如果您查看日志,您会发现来自这些主目标的各种目标和服务大多是并行启动的 。显然,多用户目标没有必要在图形目标启动之前完成 。因此,简单地使用这些主要目标并不能很好地对启动序列进行排序,尽管这对于确保只有在图形目标需要时才启动单元非常有用
继续之前,请将hello.service unit文件回滚到WantedBy=multi-user.target(如果尚未完成) 。
确保服务在网络运行后启动 。常见的启动问题是确保设备在网络启动并运行后重新启动 。Freedesktop.org的文章《网络启动后运行服务》提到,网络什么时候算“启动”还没有真正的共识 。然而,本文提供了三种选择,而满足完全可用网络要求的是network-online.target 。需要注意的是,network.target是在关机阶段使用的,不是启动阶段,所以对你有序启动没有帮助 。
在进行任何更改之前,请务必检查日志,以确保在网络可用之前,hello.service单元可以正确启动 。您可以在日志中找到network-online.target进行确认 。
你的服务其实并不需要网络服务,但你可以把它当成需要网络 。
因为设置需要=图形 。target不保证服务会在网络可用时启动,您需要其他方法来做到这一点 。幸运的是,有一个简单的方法 。将以下两行代码添加到hello.service单元文件的[Unit]部分:
After=network-online.targetWants=network-online.target这两个字段都需要生效 。重新启动机器,并在日志中找到服务记录:
[26.083121]testvm1.both.orgNetworkManager[842]:这确认了hello.service单元将在网络联机后启动 。目标这正是您想要的 。您可能已经在启动阶段看到“Hello World”消息 。还需要注意的是,开机录制的时间戳比之前晚了6秒左右 。
定义启动顺序的最佳方式 。本文详细讨论了Linux启动过程中systemd、单元文件和日志的细节,发现单元文件引入错误会发生什么 。作为一名系统管理员,我发现这种实验有助于我理解程序或服务失败时的行为,在安全的环境下故意破坏是一种很好的学习方式 。
本文的实验结果证明,仅向多用户目标或图形目标添加服务单元不能确定其在启动序列中的位置 。它仅确定一个单元是否作为图形环境的一部分启动 。实际上,启动目标多用户、目标和图形目标以及它们的所有需求几乎是并行启动的 。确保单元在特定位置启动的最佳方法是确定它依赖于哪个单元,并将新单元配置为“想要”和“在它依赖之后” 。
资源网上有很多关于systemd的参考资料,但大多数都有点简短、晦涩,甚至会产生误导 。除了本文中提到的材料之外,以下网页还提供了关于如何开始使用systemd的更可靠和详细的信息 。
Fedora项目对systemd有一个实用的介绍,其中包含了您需要了解的关于如何使用systemd来配置、管理和维护Fedora计算机的几乎所有信息 。
Fedora项目也有一个很好的备忘录,它交叉引用了过去的SystemV命令和systemd命令进行比较 。
有关systemd的技术细节和创建本项目的原因,请查看Freedesktop.org系统的描述 。
Linux.com的“更系统的乐趣”专栏提供了更高级的系统信息和技能 。
此外,还有一系列由systemd的设计者和主要开发者Lennart Poettering为Linux系统管理员撰写的深度技术文章 。这些文章写于2010年4月至2011年9月,但和当时一样现实 。关于systemd及其生态的许多其他好文章都是基于这些文章:


推荐阅读