使用 systemd 来管理启动项 启动序列

启动顺序(使用systemd管理启动项目)
了解systemd如何确定服务启动顺序,即使它本质上是一个并行系统 。
最近在设置Linux系统的时候,想知道在这些服务和依赖它们的单元启动之前,如何保证服务和其他单元之间的依赖关系已经启动并运行 。我需要更多关于systemd如何管理启动程序的知识,特别是如何在本质上决定并行系统中服务的启动顺序 。
您可能知道,SystemV(systemd的systemd前身,我在本系列的第一篇文章中解释过)通过用Sxx前缀命名启动脚本来确定启动顺序 。xx是从00到99的数字 。然后SystemV按文件名排序,然后根据需要的运行级别执行队列中的每个启动脚本 。
但是,systemd使用单元文件来定义子程序,这些子程序可以由系统管理员创建或编辑 。这些文件不仅可以用于初始化,还可以用于日常操作 。在本系列的第三篇文章中,我解释了如何创建装载单元文件 。在第五篇文章中,我解释了如何创建一个不同的单元文件——一个在启动时执行程序的服务单元文件 。您也可以修改设备文件中的一些配置,然后通过systemd日志检查您的修改在启动序列中的位置 。
准备工作/即将工作确保您已经在/etc/default/grub文件的GRUB_CMDLINE_LINUX=行中删除了rhgb和quiet,正如我在本系列的第二篇文章中所展示的那样 。这允许您查看Linux启动信息流,这是您在本文的一些实验中需要的 。
程序在本教程中,您将创建一个简单的程序,以便在主控制台和后续的systemd日志中查看启动信息 。
创建一个shell程序/usr/local/bin/hello.sh并添加以下内容 。为了确保执行结果在启动时可见,您可以很容易地在systemd日志中找到它 。你将使用一个带有一些方块的“你好世界”程序版本,这样它将会脱颖而出 。为了确保该文件是可执行的,并且为了安全起见,它需要root和700权限的用户和组所有权 。
#!/usr/bin/bash#Simpleprogramtousefortestingstartupconfigurations#withsystemd.#ByDavidBoth#LicensedunderGPLV2#echo"###############################"echo"#########HelloWorld!########"echo"###############################"在命令行上执行这个程序,检查它是否正常工作 。
[root@testvm1~]#hello.sh########################################HelloWorld!#######################################[root@testvm1~]#这个程序可以用任何脚本或编译语言实现 。hello.sh程序可以放在Linux文件系统层次结构的任何地方(FHS) 。我把它放在/usr/local/bin目录下,这样它就可以直接在命令行上执行,而不必在键入命令之前带一个路径 。我发现我创建的许多shell进程资源序列需要从命令行和其他工具(如systemd)运行 。
服务单元文件创建服务单元文件/etc/systemd/system/hello . service,并编写以下内容 。这个文件不必是可执行的,但是为了安全起见,它需要root的用户和组所有权以及644或640权限 。
#Simpleserviceunitfiletousefortesting#startupconfigurationswithsystemd.#ByDavidBoth#LicensedunderGPLV2#[Unit]Description=Myhelloshellscript[Service]Type=oneshotExecStart=/usr/local/bin/hello.sh[Install]WantedBy=multi-user.target检查服务状态以确认服务单元文件可以按计划运行 。如果有语法问题,这里会显示错误 。
[root@testvm1~]#systemctlstatushello.service●hello.service-MyhelloshellscriptLoaded:loaded(/etc/systemd/system/hello.service;disabled;vendorpreset:disabled)Active:inactive(dead)[root@testvm1~]#您可以多次运行这种“oneshot”类型的服务,没有任何问题 。这种服务适用于由服务单元文件启动的程序是主进程,并且必须在systemd启动任何相关进程之前完成的服务 。
有7种服务类型,您可以在systemd.service(5)的手册页上找到每种类型的详细说明(以及服务单元文件的其他部分) 。(也可以在文末的资料中找到更多信息 。)
出于好奇,想看看错误是什么样子的 。所以我删除了Type=oneshot行中的字母“o”,现在看起来是这样的 。Type=neshot,现在再次执行命令:
[root@testvm1~]#systemctlstatushello.service●hello.service-MyhelloshellscriptLoaded:loaded(/etc/systemd/system/hello.service;disabled;vendorpreset:disabled)Active:inactive(dead)May0608:50:09testvm1.both.orgsystemd[1]:/etc/systemd/system/hello.service:12:Failedtoparseservicetype,ignoring:neshot[root@testvm1~]#执行结果清楚地告诉我错误在哪里,所以解决错误变得非常容易 。
请注意,即使在以原始形式保存hello.service文件后,错误仍然存在 。虽然重启机器可以消除这种错误,但你不必这样,所以我去想办法清理这种持续存在的错误 。我遇到了一些错误,需要systemctl daemon-reload命令来重置错误状态,但是在这个例子中它不起作用 。可以用这个命令修复的错误似乎总是有这样的声明,所以你知道运行它 。


推荐阅读