百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Linux 软件开发人员指南:3 使用 systemd 管理服务

ahcoder 2025-04-06 13:03 7 浏览


在上一章中,您了解了 Linux 中进程的工作原理。现在,让我们看看这些进程是如何被封装在额外的抽象层中的:systemd 服务。

到目前为止您看到的命令——ls、mv、rm、ps 等——都在前台运行,并且附着在您的 shell 会话上。您运行它们,程序执行它们的任务,然后它们退出。然而,并非所有程序都这样运行。

服务,也经常被称为守护进程,是长时间在后台运行的进程。这些可以是数据库和 Web 服务器等,也可以是常规的系统服务,比如您的网络管理器、桌面环境等。这些长时间运行的后台服务通常通过像 systemd 这样的 init 系统启动和控制。

这里的 init 指的是操作系统内核启动的第一个进程,这个进程的任务是负责启动系统中配置为运行的所有其他进程。

使用名为 systemctl 的命令行实用程序控制 systemd 服务。它将被用来启动和停止服务,例如,重启一个表现异常的服务或重新加载配置已更改的服务。

如果您在书中跳来跳去,还没有读前一章,您仍然可以从这一章中获得价值。现在,只需将进程视为任何正在运行的命令、应用程序或服务。当您准备好更详细地了解进程的工作原理时,您可以阅读第 2 章,“处理进程”。

在本章中,您将学习所有关于以下内容:

  • 您将用于与 systemd 服务交互的命令:systemctl
  • 对 init 系统的作用以及 systemd 如何特别扮演这一角色的更深入了解
  • 使用 systemctl 管理服务
  • 在容器环境(如 Docker 容器)中工作的一些技巧,这些环境通常没有我们在本章描述的强大服务管理层

注意

本章仅适用于 Linux —— macOS 和 Windows(甚至其他 Unix 系统)使用不同的工具管理进程。实际上,不同的 Linux 发行版使用不同的工具,然而,systemd 是最广泛使用的。虽然概念相似,但了解现代 Linux 环境如何管理服务对开发者最有用。

基础知识

Linux 服务是在 Linux 系统上运行的后台进程,用于执行特定任务。它们与 Windows 服务或 macOS 上的守护进程类似。

大多数非容器化的 Linux 环境使用 systemd 来管理服务。您将使用以下两个工具与 systemd 交互:

  • systemctl:控制服务(在 systemd 术语中称为“单元”)
  • journalctl:让您使用系统日志

我们将在本章介绍 systemctl,并在本书后面的第 16 章“监控应用程序日志”中介绍 journalctl。

systemd 是 Linux 的系统和服务管理器,提供了一种标准的方式来管理服务。它现在被广泛用作大多数 Linux 发行版的默认 init 系统。许多 Linux 发行版之前使用的是来自 Unix 的 SysV init 系统,这些系统仍然被许多现代 Unix 操作系统使用。其他的,如 Alpine 和 Gentoo Linux,使用 OpenRC 作为他们的 init 系统。还有更多的 init 系统存在,然而,绝大多数 Linux 发行版现在使用 systemd。有了 systemd,可以启动、停止、重启、启用(设置为在启动时启动)、禁用服务,并检查它们的状态。服务由一个单元文件定义,该文件指定了服务应该如何被 systemd 管理。

要使用 systemd 管理服务,您可以使用以下基本命令(我们将在本章后面深入每个命令):

  • systemctl start :启动服务。
  • systemctl stop :停止服务。
  • systemctl restart :重启服务。
  • systemctl status :显示服务的当前状态。

请记住,只有具有 root 权限的用户(例如,使用 sudo)才能使用 systemd 管理系统服务。

init

让我们快速了解一下您会经常看到的一个常用术语。在 Linux 中,init —— “initialization”(初始化)的缩写 —— 是系统启动时启动的第一个进程。不出所料,您可以在 PID 1 中找到它。init 负责管理启动过程,并启动所有已配置为在系统上运行的其他进程和服务。它还将回收孤儿进程(原始父进程已死亡的进程)并将它们作为自己的子进程,以确保它们仍然正常运行。

就像 Linux 世界中的几乎所有事物一样,有几种不同的、相互排斥的程序可以担任这个角色。它们都被称为 init 系统,这是任何可以担任这个重要的引导、初始化和协调角色的软件的通用名称。如前所述,Linux 有几种可用的 init 系统,包括 System V init (SysV)、OpenRC 和 systemd。大多数现代 Linux 系统已经切换到 systemd,这也是我们在这里介绍它的原因。

您使用的是哪个 init 系统将决定服务的定义和管理方式,因此请记住,这里看到的所有内容只适用于 systemd。

进程和服务

让我们谈谈进程和服务之间微妙的区别。您可以将服务视为围绕软件的某种包装,使其更容易作为运行中的进程进行管理。

服务为程序(以及由此程序生成的进程)的系统处理方式增加了便利的功能。例如,它允许您定义不同进程之间的依赖关系,控制启动顺序,为进程添加启动时的环境变量,限制资源使用,控制权限等许多其他有用的事情。为了给整个包装打个结,服务提供了一个简单的名称来引用您的程序。我们将在稍后的第 10 章“配置软件”中向您展示如何创建自己的服务。

在本章的其余部分,我们将坚持管理现有的服务。

systemctl 命令

systemctl 是您将用于管理系统上已定义服务的工具。这些示例将使用不存在的 foobar 服务作为您可能管理的任何服务的代表。

检查服务状态

systemctl status 检查服务的状态。您将获得各种可用于各种故障排除任务的数据。这是 nginx Web 服务器服务的输出示例:


图 3.1: nginx Web 服务器服务输出

让我们逐行剖析这个命令产生的密集输出信息:

  • 服务名称:服务在其单元文件中定义的名称。
  • 加载状态:服务单元文件是否已成功加载并准备好启动。
  • 活动状态:服务的当前状态——是否正在运行、非活动或失败——以及这种情况持续了多长时间。
  • 文档:如果已安装,这是您可以找到相关文档的主页面。
  • 主进程和子进程:与服务相关联的主进程的进程 ID (PID),以及已启动的任何子进程的附加条目。
  • 资源使用情况:RAM(内存)和 CPU 时间。
  • 控制组 (CGroup):有关此进程所属控制组的详细信息。
  • 日志预览:服务输出的一些日志行,让您了解正在发生的事情。 这些信息提供了服务及其状态的详细概述,对于调试问题或检查服务的健康状况非常有用。

如果服务失败,输出通常会提供失败的原因,例如退出代码或错误描述。

启动服务

systemctl start foobar

这将启动服务。如果服务已经在运行,此命令将不会产生任何效果。

停止服务

systemctl stop foobar

这将停止服务。如果服务没有在运行,那么它应该不会产生任何效果。

重启服务

systemctl restart foobar

这将停止然后启动服务。它等同于运行:

systemctl stop foobar
systemctl start foobar

注意 小心使用此命令:如果服务的配置文件自启动以来在磁盘上已更改,并且该配置文件中有一个错误阻止程序成功启动,那么重启将愉快地停止您正在运行的服务,然后无法再次启动它。

这种合乎逻辑但可能不受欢迎的行为多年来已经困扰了许多开发人员,因此在重启之前请确保您的服务配置仍然有效。

许多流行的程序都有内置的配置验证,例如,对于 nginx,您可以运行:

nginx -t

以测试磁盘上的配置。

重新加载服务

systemctl reload foobar

并非所有服务都支持此子命令——这取决于创建服务配置的人来实现它。如果服务有重新加载选项,它通常比重启更安全。

通常,重新加载:

  • 重新检查磁盘上的配置以确保其有效
  • 如果可能,在不中断运行进程的情况下重新将配置读入内存
  • 在验证配置并确保进程在停止后能成功启动后,仅重新启动进程

像 Linux 中的许多事情一样,这是一种约定,而不是严格强制的要求,所以您可能会遇到软件:

  • 没有实现重新加载子命令
  • 没有实现上述一些安全特性(配置验证等)
  • 用重新加载做其他事情,因为开发者或打包者认为这是个好主意

通常,当更新应用程序的配置文件时,特别是在生产环境中,您应该优先选择重新加载而不是重启。

启用和禁用

systemctl enable foobar – 配置 foobar 在启动时自动启动。
systemctl disable foobar – 如果 foobar 配置为自动启动,则去除该配置,并将 foobar 变成手动管理的服务。

这里的关键区别在于,虽然 start 和 stop 会立即生效——它们确保服务现在正在运行(或停止);enable 和 disable 是关于将来的系统启动。然而,它们在运行命令时对服务的“运行”状态没有影响。

开发人员常犯的一个错误是假设 enable 会启动服务。它不会。如果您现在想启动 nginx Web 服务器,并确保它在每次虚拟机重启时自动启动,您需要运行两个命令:

systemctl start nginx
systemctl enable nginx

因此,enable 和 disable 带有一个可选标志,也可以启动(或在 disable 的情况下停止)服务。这个命令等同于上面的两个命令:

systemctl enable --now nginx

关于 Docker 的说明 虽然 systemctl 是传统 Linux 系统上管理服务的常用工具,但由于容器的隔离和自包含特性,它通常不在 Docker 容器中使用。

Docker 容器理想上运行一个单一进程,因此不需要复杂的启动阶段或进程管理。从本质上讲,容器就是进程,并且无法访问主机系统的 init 系统(包括 systemd)。

虽然在 Docker 容器中可以访问这些命令,但通常不建议在其中使用任何类型的服务管理系统。

Docker 容器理想上包含一个单一应用程序,并且在启动时启动一个单一进程。为此,不需要服务管理——运行中的容器是您的服务包,您的 Docker 容器本质上就是您的进程。

我们不推荐包含多个进程或重大内部服务管理的 Docker 设置,所以我们不会在这里讨论:就像家庭一样,所有快乐的 Docker 镜像都以相同的方式相似,而每个不快乐的 Docker 配置都有它自己的不快乐方式。

结论 在本章中,您学习了如何在 Linux 中管理服务,并介绍了您将用于控制它们的实用命令。我们为您提供了理论,以便您能够理解在实时系统中遇到的所有术语:init 是什么,systemd 在 Linux 系统上的作用,以及您需要与之交互的命令。

在下一章中,我们将向您展示一些与您的 shell 和命令历史交互的有用技巧,以便您可以节省时间,看起来像您最喜欢的电影中的 Unix 奇才(这也会使您在日常工作中变得更快、更高效,但这样说就没有那么有趣了)

相关推荐

KaOS 2025.05版本发布:全面拥抱Qt6,彻底告别Qt5

KaOSLinux2025.05版本重磅发布:全面拥抱Qt6,开启KDE生态新篇章继2025.03版本发布两个月后,专注于KDE桌面环境、采用XFS文件系统的滚动发行版Li...

基于FIMC接口的CMOS摄像头驱动分析与设计

摘要:目前的嵌入式系统中,USB摄像头使用比较普遍,但其应用会受到传输速度的限制。本文采用一款高速CMOS摄像头,其驱动利用S3C6410内置的FIMC接口技术,采用DMA和ping-pong缓冲...

没错是微软 推出基于Linux的交换机系统

2015-09-2205:59:59作者:郑伟你没看错,为了提升自身Azure云数据中心内网络设备的兼容性及开放性,微软也开始推出基于Linux的网络交换机系统了。这个被称为AzureCloud...

Linus Torvalds 宣布首个 Linux 内核 6.16 候选版本

Linux内核负责人兼创始人LinusTorvalds宣布关闭合并窗口,该窗口用于将主要新功能添加到内核中,并开始发布Linux6.16候选版本,从候选版本1(Linux6.16-r...

Linux内核漏洞将影响Haswell架构服务器

在infoq网站上,GilTene最近报告一个十分重要,但并不为人知Linux内核补丁,特别对采用Haswell架构的Linux系统用户和管理员应该特别关注。报告提醒RedHat发行版的用户(包括...

关于Linux性能调优中网络I/O的一些笔记

写在前面和小伙伴分享一些Linux网络优化的笔记,内容很浅,可以用作入门博文内容结合《Linux性能优化》读书笔记整理涉及内容包括常用的优化工具(mii-tool,ethtool,ifconfig,i...

国产操作系统- Veket Linux(国产操作系统之光银河麒麟阅读理解)

VeketLinux是一个随身的可装在U盘的Linux操作系统。主要面向桌面用户。它的设计重点是提供简单易用且稳定的操作系统,同时保持更新和开发。它具有强大的功能集和广泛的用户基础,可满足...

AlmaLinux 9.6发布:升级工具、初步支持IBM Power虚拟化技术

IT之家5月21日消息,科技媒体linuxiac昨日(5月20日)发布博文,报道称代号为SageMargay的AlmaLinux9.6发行版已上线,距上一版本9.5发...

跟老韩学Linux运维架构师系列,vim与view的基本使用

下面是vim和view的10个实例:用vim打开一个新文件:vimnewfile.txt这个命令将会在vim编辑器中打开一个新文件。在vim中移动光标:使用方向键或h、j、k、l键来移动光标。在v...

malloc底层原理剖析——ptmalloc内存池

malloc底层为什么是内存池malloc大家都用过,其是库函数。我们都知道库函数在不同的操作系统中其实执行的是系统调用,那么malloc在Linux上执行的是哪个系统调用呢?brk()和mmap()...

Zen 6架构首秀Linux,AMD加速下一代处理器布局

IT之家5月15日消息,科技媒体Phoronix昨日(5月14日)发布博文,报道称AMD已经开始为下一代“Zen6”处理器做准备,已为该构架向Linux内核提交了首个补丁,...

为何越来越多企业转向安卓/Linux工业平板电脑?答案在这里

在工业领域,设备的稳定性至关重要,尤其是工业平板电脑,常年运行在高温、粉尘、潮湿等复杂环境下,一旦系统崩溃或者卡顿,可能会影响整个生产流程。那么,为什么越来越多的企业选择安卓/Linux工业平板电脑,...

从3ms到0.8ms:ARM+Linux如何重塑工业控制实时性标杆

在智能制造领域,产线控制系统对实时性的要求越来越高。根据行业调研数据,超过65%的工业现场出现过因系统响应延迟导致的故障停机,平均每次停机造成的直接损失高达2-8万元。传统x86架构搭配Windows...

看Linux如何"挖坑种树"

写在前面,有人看我的Linux文章说技术难度不深,笔者不是不想写深,笔者是觉得Linux难就难在入门,入门之后你就知道如何上网查询你所要要解决的Linux需求。如果你已入门,此文已对你无用,请略过此...

AlmaLinux 9.6 发布,新增功能亮点纷呈!

距离上一版本AlmaLinux9.5发布六个月后,基于5.14内核的AlmaLinux正式宣布其企业级Linux发行版的9.x系列第六个更新——AlmaLinux9.6(Sag...