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

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

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


在上一章中,您了解了 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 奇才(这也会使您在日常工作中变得更快、更高效,但这样说就没有那么有趣了)

相关推荐

Linux 6.15将更新媒体子系统:高通Iris驱动首次亮相

IT之家3月24日消息,科技媒体phoronix昨日(3月23日)发布博文,报道称Linux6.15内核将于本周启动合并窗口,首批提交的PullRequest请求之一,就...

Ubuntu 25.04发行版登场:Linux 6.14内核,带来多项技术革新

IT之家4月18日消息,科技媒体linuxiac昨日(4月17日)发布博文,报道称代号为PluckyPuffin的Ubuntu25.04发行版正式上线,搭载最新Linu...

WordPress 6.8 版本发布:聚焦性能升级,代号“Cecil”

WordPress6.8版本发布:聚焦性能升级,代号“Cecil”全球最受欢迎的内容管理系统(CMS)WordPress正式推出最新版本6.8,代号“塞西尔”(Cecil),以此致敬传奇钢琴家...

Linus Torvalds接受微软Hyper-V升级 下一代Linux启动会更快

虽然Windows的粉丝和Linux的粉丝经常喜欢进行激烈的键盘大战,但操作系统的制造商们自己也了解彼此的优缺点。毫无疑问,微软也明白这一点,事实上,它甚至鼓励用户尝试Linux,尽管是使用...

Debian 12发布:Linux内核升级6.1(debian更新内核)

IT之家6月11日消息,Debian是最古老的GNU/Linux发行版之一,也是许多其他基于Linux的操作系统的基础,包括Ubuntu、Kali、MX和树莓派OS等。这...

Linux Mint预告新功能:升级Nemo搜索、LMDE 7支持OEM安装

IT之家4月10日消息,LinuxMint发布了最新月度简讯,宣布增强Nemo文件管理器的文件搜索功能、Cinnamon桌面环境开始支持Wayland、LMDE7(LinuxM...

Linux 6.2合并大量网络系统更新:推进Wi-Fi 7和800 Gbps网络

IT之家12月15日消息,Linux6.2合并窗口期内已经确认将会合并大量网络子系统更新。和以往版本相同,Linux6.2内核更新周期在网络功能上有大量的改进,更多的细节可以访问这条...

Linux内核升级实践指南(linux内核怎么升级)

Linux内核升级是一个需要谨慎操作的过程,但掌握正确方法后可以显著提升系统性能、安全性或硬件兼容性。以下是一份详细的实践指南,涵盖主流方法及注意事项:一、准备工作查看当前内核版本bashuname...

Linux又将迎来大版本更新 5.20版可能会被称为Linux 6.0

如果你错过了昨天Linux5.19的发布公告,那么这一消息需要回顾一下:被称为Linux5.20的开发中的内核很可能会被称为Linux6.0。根据LinusTorvalds对现代版本的划分,L...

周六的娱乐就是安装一台OracleLinux虚拟机(一)

每个人有每个人的娱乐方式。老父亲可能喜欢摆弄一些机械工具修修补补。我趁着周六安装一套OracleLinux,寓学于乐。在oracle网站上,下载VirtualBox,现在最新版本是7.0.8。在安装过...

Linux系统下Gaussian 16的安装(linux系统如何安装新软件)

Gaussian是目前使用最多的量子化学计算软件,当前最新的版本为Gaussian16C.01。理论上来说Gaussian并不需要安装,因为高斯一般是不出售源代码的,只有二进制文件,以Gaussi...

「Linux基础」VMWare虚拟机安装CentOS后配置静态ip

在VMWare中安装本地虚拟机CentOS7操作系统,动态IP地址会经常变化,不便于管理与实验。为了便于实验,考虑设置成静态IP地址,目标是本地局域网可以通过NAT网关互相访问,且能连接互联网。由于是...

Win10虚拟机,Hyper-V安装CentOS,一次成功

打开控制面板,选择程序选择启用或关闭Windows功能选中Hyper-V下所有的组件。提示我们需要,重启计算机,保存我们的文件,之后点击“立即重新启动”选择开始菜单,输入Hy,就可以打开虚拟机管理器了...

如何在Windows 10中的Hyper-V虚拟机上安装CentOS Linux

注意双重引导的一种可行且相当不错的替代方法是在虚拟机上安装各种操作系统。Microsoft正式支持CentOS作为Hyper-V的来宾OS,并且在安装时可以很好地集成。自CentOS6.4版以来,用...

安装Linux虚拟机的5个理由,以及不安装的5个原因

虚拟机(VM)允许你在不永久更改计算机的情况下探索Linux。如果你对Linux很好奇,但犹豫是否要尝试,VM提供了一个安全、灵活的解决方案。如果这是你第一次听说虚拟机,虚拟机就像“计算机中的计算机”...