Linux 软件开发人员指南:3 使用 systemd 管理服务
ztj100 2025-10-02 11:34 3 浏览 0 评论
在上一章中,您了解了 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 <service>:启动服务。
- systemctl stop <service>:停止服务。
- systemctl restart <service>:重启服务。
- systemctl status <service>:显示服务的当前状态。
请记住,只有具有 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 <service> 检查服务的状态。您将获得各种可用于各种故障排除任务的数据。这是 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集群自动化监控系统Zabbix集群搭建到实战
-
自动化监控系统...
- systemd是什么如何使用_systemd/system
-
systemd是什么如何使用简介Systemd是一个在现代Linux发行版中广泛使用的系统和服务管理器。它负责启动系统并管理系统中运行的服务和进程。使用管理服务systemd可以用来启动、停止、...
- Linux服务器日常巡检脚本分享_linux服务器监控脚本
-
Linux系统日常巡检脚本,巡检内容包含了,磁盘,...
- 7,MySQL管理员用户管理_mysql 管理员用户
-
一、首次设置密码1.初始化时设置(推荐)mysqld--initialize--user=mysql--datadir=/data/3306/data--basedir=/usr/local...
- Python数据库编程教程:第 1 章 数据库基础与 Python 连接入门
-
1.1数据库的核心概念在开始Python数据库编程之前,我们需要先理解几个核心概念。数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它就像一个电子化的文件柜,能让我们高效...
- Linux自定义开机自启动服务脚本_linux添加开机自启动脚本
-
设置WGCloud开机自动启动服务init.d目录下新建脚本在/etc/rc.d/init.d新建启动脚本wgcloudstart.sh,内容如下...
- linux系统启动流程和服务管理,带你进去系统的世界
-
Linux启动流程Rhel6启动过程:开机自检bios-->MBR引导-->GRUB菜单-->加载内核-->init进程初始化Rhel7启动过程:开机自检BIOS-->M...
- CentOS7系统如何修改主机名_centos更改主机名称
-
请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1.前言本文将讲解CentOS7系统如何修改主机名。...
- 前端工程师需要熟悉的Linux服务器(SSH 终端操作)指令
-
在Linux服务器管理中,SSH(SecureShell)是远程操作的核心工具。以下是SSH终端操作的常用命令和技巧,涵盖连接、文件操作、系统管理等场景:一、SSH连接服务器1.基本连接...
- Linux开机自启服务完全指南:3步搞定系统服务管理器配置
-
为什么需要配置开机自启?想象一下:电商服务器重启后,MySQL和Nginx没自动启动,整个网站瘫痪!这就是为什么开机自启是Linux运维的必备技能。自启服务能确保核心程序在系统启动时自动运行,避免人工...
- Kubernetes 高可用(HA)集群部署指南
-
Kubernetes高可用(HA)集群部署指南本指南涵盖从概念理解、架构选择,到kubeadm高可用部署、生产优化、监控备份和运维的全流程,适用于希望搭建稳定、生产级Kubernetes集群...
- Linux项目开发,你必须了解Systemd服务!
-
1.Systemd简介...
- Linux系统systemd服务管理工具使用技巧
-
简介:在Linux系统里,systemd就像是所有进程的“源头”,它可是系统中PID值为1的进程哟。systemd其实是一堆工具的组合,它的作用可不止是启动操作系统这么简单,像后台服务...
- Linux下NetworkManager和network的和平共处
-
简介我们在使用CentoOS系统时偶尔会遇到配置都正确但network启动不了的问题,这问题经常是由NetworkManager引起的,关闭NetworkManage并取消开机启动network就能正...
你 发表评论:
欢迎- 一周热门
-
-
MySQL中这14个小玩意,让人眼前一亮!
-
旗舰机新标杆 OPPO Find X2系列正式发布 售价5499元起
-
面试官:使用int类型做加减操作,是线程安全吗
-
C++编程知识:ToString()字符串转换你用正确了吗?
-
【Spring Boot】WebSocket 的 6 种集成方式
-
PyTorch 深度学习实战(26):多目标强化学习Multi-Objective RL
-
pytorch中的 scatter_()函数使用和详解
-
与 Java 17 相比,Java 21 究竟有多快?
-
基于TensorRT_LLM的大模型推理加速与OpenAI兼容服务优化
-
这一次,彻底搞懂Java并发包中的Atomic原子类
-
- 最近发表
-
- Linux集群自动化监控系统Zabbix集群搭建到实战
- systemd是什么如何使用_systemd/system
- Linux服务器日常巡检脚本分享_linux服务器监控脚本
- 7,MySQL管理员用户管理_mysql 管理员用户
- Python数据库编程教程:第 1 章 数据库基础与 Python 连接入门
- Linux自定义开机自启动服务脚本_linux添加开机自启动脚本
- linux系统启动流程和服务管理,带你进去系统的世界
- CentOS7系统如何修改主机名_centos更改主机名称
- 前端工程师需要熟悉的Linux服务器(SSH 终端操作)指令
- Linux开机自启服务完全指南:3步搞定系统服务管理器配置
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)