Linux 软件开发人员指南:3 使用 systemd 管理服务
suiw9 2024-10-31 16:04 34 浏览 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 奇才(这也会使您在日常工作中变得更快、更高效,但这样说就没有那么有趣了)
相关推荐
- 俄罗斯的 HTTPS 也要被废了?(俄罗斯网站关闭)
-
发布该推文的ScottHelme是一名黑客,SecurityHeaders和ReportUri的创始人、Pluralsight作者、BBC常驻黑客。他表示,CAs现在似乎正在停止为俄罗斯域名颁发...
- 如何强制所有流量使用 HTTPS一网上用户
-
如何强制所有流量使用HTTPS一网上用户使用.htaccess强制流量到https的最常见方法可能是使用.htaccess重定向请求。.htaccess是一个简单的文本文件,简称为“.h...
- https和http的区别(https和http有何区别)
-
“HTTPS和HTTP都是数据传输的应用层协议,区别在于HTTPS比HTTP安全”。区别在哪里,我们接着往下看:...
- 快码住!带你十分钟搞懂HTTP与HTTPS协议及请求的区别
-
什么是协议?网络协议是计算机之间为了实现网络通信从而达成的一种“约定”或“规则”,正是因为这个“规则”的存在,不同厂商的生产设备、及不同操作系统组成的计算机之间,才可以实现通信。简单来说,计算机与网络...
- 简述HTTPS工作原理(简述https原理,以及与http的区别)
-
https是在http协议的基础上加了一层SSL(由网景公司开发),加密由ssl实现,它的目的是为用户提供对网站服务器的身份认证(需要CA),以至于保护交换数据的隐私和完整性,原理如图示。1、客户端发...
- 21、HTTPS 有几次握手和挥手?HTTPS 的原理什么是(高薪 常问)
-
HTTPS是3次握手和4次挥手,和HTTP是一样的。HTTPS的原理...
- 一次安全可靠的通信——HTTPS原理
-
为什么HTTPS协议就比HTTP安全呢?一次安全可靠的通信应该包含什么东西呢,这篇文章我会尝试讲清楚这些细节。Alice与Bob的通信...
- 为什么有的网站没有使用https(为什么有的网站点不开)
-
有的网站没有使用HTTPS的原因可能涉及多个方面,以下是.com、.top域名的一些见解:服务器性能限制:HTTPS使用公钥加密和私钥解密技术,这要求服务器具备足够的计算能力来处理加解密操作。如果服务...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- 图解HTTPS「转」(图解http 完整版 彩色版 pdf)
-
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。...
- HTTP 和 HTTPS 有何不同?一文带你全面了解
-
随着互联网时代的高速发展,Web服务器和客户端之间的安全通信需求也越来越高。HTTP和HTTPS是两种广泛使用的Web通信协议。本文将介绍HTTP和HTTPS的区别,并探讨为什么HTTPS已成为We...
- HTTP与HTTPS的区别,详细介绍(http与https有什么区别)
-
HTTP与HTTPS介绍超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的...
- 一文让你轻松掌握 HTTPS(https详解)
-
一文让你轻松掌握HTTPS原文作者:UC国际研发泽原写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。...
- 如何在Spring Boot应用程序上启用HTTPS?
-
HTTPS是HTTP的安全版本,旨在提供传输层安全性(TLS)[安全套接字层(SSL)的后继产品],这是地址栏中的挂锁图标,用于在Web服务器和浏览器之间建立加密连接。HTTPS加密每个数据包以安全方...
- 一文彻底搞明白Http以及Https(http0)
-
早期以信息发布为主的Web1.0时代,HTTP已可以满足绝大部分需要。证书费用、服务器的计算资源都比较昂贵,作为HTTP安全扩展的HTTPS,通常只应用在登录、交易等少数环境中。但随着越来越多的重要...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)