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

multi-user.target没有必要在graphical.target启动前完成 。所以,简单的使用这些主要目标来并不能很好地排序启动序列,尽管它在保证单元只在它们被graphical.target需要时启动这方面很有用 。
在继续之前,把 hello.service单元文件回滚至WantedBy=multi-user.target(如果还没做的话) 。
确保一个服务在网络运行后启动一个常见的启动问题是保证一个单元在网络启动运行后再启动 。Freedesktop.org的文章《在网络启动后运行服务》中提到,目前没有一个真正的关于网络何时算作“启动”的共识 。然而,这篇文章提供了三个选项,满足完全可用网络需求的是network-online.target 。需要注意的是network.target是在关机阶段使用的而不是启动阶段,所以它对你做有序启动方面没什么帮助 。
在做出任何改变之前,一定要检查下日志,确认 hello.service单元在网络可用之前可以正确启动 。你可以在日志中查找network-online.target来确认 。
你的服务并不真的需要网络服务,但是你可以把它当作是需要网络的 。
因为设置 WantedBy=graphical.target并不能保证服务会在网络启动可用后启动,所以你需要其他的方法来做到这一点 。幸运的是,有个简单的方法可以做到 。将下面两行代码加入hello.service单元文件的[Unit]段:
After=network-online.target                                                                            Wants=network-online.target两个字段都需要才能生效 。重启机器,在日志中找到服务的记录:
[   26.083121] testvm1.both.org NetworkManager[842]:这样证实了 hello.service单元会在network-online.target之后启动 。这正是你想要的 。你可能也看见了 “Hello World” 消息在启动阶段出现 。还需要注意的是,在启动时记录出现的时间戳比之前要晚了大约 6 秒 。
定义启动序列的最好方法本文章详细地探讨了 Linux 启动时 systemd 和单元文件以及日志的细节,并且发现了当错误被引入单元文件时候会发生什么 。作为系统管理员,我发现这类实验有助于我理解程序或者服务出故障时的行为,并且在安全环境中有意破坏是一种学习的好方法 。
文章中实验结果证明,仅将服务单元添加至 multi-user.target或者graphical.target并不能确定它在启动序列中的位置 。它仅仅决定了一个单元是否作为图形环境一部分启动 。事实上,启动目标multi-user.targetgraphical.target和所有它们的Wants以及Required几乎是并行启动的 。确保单元在特定位置启动的最好方法是确定它所依赖的单元,并将新单元配置成WantAfter它的依赖 。
资源网上有大量的关于 systemd 的参考资料,但是大部分都有点简略、晦涩甚至有误导性 。除了本文中提到的资料,下列的网页提供了跟多可靠且详细的 systemd 入门信息 。
Fedora 项目有一篇切实好用的 systemd 入门,它囊括了几乎所有你需要知道的关于如何使用 systemd 配置、管理和维护 Fedora 计算机的信息 。
Fedora 项目也有一个不错的 备忘录,交叉引用了过去 SystemV 命令和 systemd 命令做对比 。

推荐阅读