企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 使用 systemd 控制服务 ## 目标: * 列出由 systemd 服务启动的系统守护进程和网络服务,以及套接字单元 * 使用 systemctl 控制系统守护进程和网络服务 ## systemd简介 系统启动和服务器进程由 systemd 系统和服务管理器进行管理。此程序提供了一种方式,可以在启动时和运行中的系统上激活系统资源、服务器守护进程和其他进程。 守护进程是在执行各种任务的后台等待或运行的进程。为了侦听连接,守护进程使用套接字。套接字可以由守护进程创建,或者与守护进程分离,并且可能由另一个进程创建(如 systemd),随后在客户端建立连接时将套接字传递到守护进程。 服务通常指的是一个或多个守护进程,但启动或停止一项服务可能会对系统的状态进行一次性更改(如配置网络接口),不会留下守护进程之后继续运行。 一点历史 许多年来,Linux 和 UNIX 系统的进程 ID 1 属于 init 进程。此进程负责激活系统上的其他服务。常用的守护进程在系统启动时通过 System v 和 Linux Standard Base(LSB)init 脚本启动。较不常用的守护进程由其他服务根据需要启动,如 initd 或 xinetd。这些系统存在诸多限制,但 systemd 可以解决。 在 Red Hat Enterprise Linux 7 中进程 ID 1 属于 systemd 这一新的 init 系统。以下是 systemd 提供的几项新功能: * 并行化功能,它可以提高系统的启动速度。 * 按需启动守护进程,而不需要单独的服务。 * 自动服务依赖关系管理可以防止长时间超时,例如在网络不可用时不启动网络服务。 * 利用 Linux 控制组一起追踪相关进程的方式。 ### 注意 有了 systemd 基于 shell 的服务脚本仅用于几个传统服务。因此,带有 shell 变量的配置文件将被取代,如 /etc/sysconfig 中可找到的配置文件。仍在使用的配置文件作为 systemd 环境文件被纳入, 并作为 NAME=VALUE 对进行读取。它们不再以 shell 脚本的形式提供。 systemctl 和 systemd 单元 systemctl 命令用于管理各种类型的 systemd 对象,它们称为单元。可以通过 systemctl -t help 命令显示可用单元类型的列表。 ### 重要 systemctl 可以缩写或“省略”单元名称、进程数条目和单元说明,除非运行时带有 -l 选项。 下方列出了一些常用单元类型: * 服务单元具有 .service 扩展名,代表系统服务。这种单元用于启动经常访问的守护进程,如 web 服务器。 * 套接字单元具有 .socket 扩展名,代表进程间通信(IPC)套接字。套接字的控制可以在建立客户端连接时传递到守护进程或新启动的服务。套接字单元用于延迟系统启动时的服务启动,或者按需启动不常用的服务。这原则上类似于使用 xinetd 超级服务器按需启动的服务。 * 路径单元具有 .path 扩展名,用于将服务的激活推迟到特定文件系统更改发生之后。这通常用于使用假脱机目录的服务,如打印系统。 #### 服务状态 可以通过 systemctl status name.type 查看服务的状态。如果未提供单元类型,则 systemctl 将显示服务单元的状态(如果存在)。 ~~~ [root@serverX~]# systemctl status sshd.service sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled) Active: active (running) since Thu 2014-02-27 11:35:39 EST: 7h ago Main PID: 1073 (sshd) CGroup: /system.slice/sshd.service └──1037 /usr/sbin/sshd -D Feb 27 11:51:39 server0.example.com systemd[1]: Started OpenSSH server daemo. Feb 27 11:51:39 server0.example.com sshd[1073]: Could not load host key: /etc. . .y Feb 27 11:51:39 server0.example.com sshd[1073]: Server listening on 0.0.0.0 . . . . Feb 27 11:51:39 server0.example.com sshd[1073]: Server listening on : : port 22. Feb 27 11:51:39 server0.example.com sshd[1270]: error: Could not load host k . . y Feb 27 11:51:39 server0.example.com sshd[1270]: Accepted password for root f . . . 2 Hint: Some lines were ellipsized, use -l to show in full. ~~~ 状态输出中可以找到表示服务状态的几个关键字: |关键字 | 描述 | | --- | --- | |loaded | 单元配置文件已处理。 | |active(running) |正在通过一个或多个持续进程运行。 | |active(exited) |已成功完成一次性配置。 | |active(waiting) |运行中,但正在等待事件。 | |inactive |不在运行。 | |enabled |将在系统启动时启动。 | |disabled |不会在系统启动时启动。 | |static |无法启用,但可以由某一启用的单元自动启动。 | ### 注意 systemctl status NAME 命令取代了旧版 Red Hat Enterprise Linux 中使用的service NAME status 命令。 ## 使用 systemctl 列出单元文件 * 查询所有单元的状态,已验证系统启动。 ~~~ [root@serverX~]# systemctl ~~~ * 仅查询服务单元的状态。 ~~~ [root@serverX~]# systemctl --type=service ~~~ * 调查属于失败或维护状态的任何单元。可选添加 -l 选项以显示完整的输出。 ~~~ [root@serverX~]# systemctl status rngd.service -l ~~~ * 也可以使用 status 参数来判断特定的单元是否活动,以及显示该文件是否已启用在系统启动时启动。其他备用命令也可轻松显示活动和已启用状态: ~~~ [root@serverX~]# systemctl is-active sshd [root@serverX~]# systemctl is-enable sshd ~~~ * 列出所有已加载单元的活动状态。也可选择限制单元类型。--all 选项可加入不活动的单元。 ~~~ [root@serverX~]# systemctl list-units --type=service [root@serverX~]# systemctl list-units --type=service -all ~~~ * 查看所有单元的已启用和已禁用配置。也可选择限制单元类型。 ~~~ [root@serverX~]# systemctl list-unit-files --type=service ~~~ * 仅查看失败的服务。 ~~~ [root@serverX~]# systemctl --failed --type=service ~~~ ## 启动和停止运行中系统上的系统守护进程 启动、停止、重新启动、重新加载和验证状态是管理服务时经常执行的操作。 * 查看 sshd 服务的状态。 ~~~ [root@serverX~]# systemctl status sshd.service sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled) Active: active (running) since Thu 2014-02-27 11:51:39 EST: 7h ago Main PID: 1073 (sshd) CGroup: /system.slice/sshd.service └──1037 /usr/sbin/sshd -D ~~~ * 验证进程正在运行。 ~~~ [root@serverX~]# ps -up 1073 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1073 0.1 0.0 82992 3612 ? Ss 15:15 0:00 /usr/sbin/sshd -D ~~~ * 停止服务并验证其状态。 ~~~ [root@serverX~]# systemctl stop sshd.service [root@serverX~]# systemctl status sshd.service sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled) Active: inactive (dead) since Thu 2014-02-27 11:51:39 EST: 2s ago Main PID: 1073 (code=exited , status=0/SUCCESS) ~~~ * 启动服务并查看其状态。进程 ID 已经改变。 ~~~ [root@serverX~]# systemctl start sshd.service [root@serverX~]# systemctl status sshd.service sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled) Active: active (running) since Thu 2014-02-27 18:52:39 EST: 2s ago Main PID: 1253 (sshd) CGroup: /system.slice/sshd.service └──1253 /usr/sbin/sshd -D ~~~ * 以单一命令停止服务,然后再启动该服务。 ~~~ [root@serverX~]# systemctl restart sshd.service [root@serverX~]# systemctl status sshd.service sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled) Active: active (running) since Thu 2014-02-27 18:54:39 EST: 2s ago Main PID: 1268 (sshd) CGroup: /system.slice/sshd.service └──1268 /usr/sbin/sshd -D ~~~ * 发出指示使服务读取和重新加载其配置文件,而不完全停止和启动服务。进程 ID 不会改变。 ~~~ [root@serverX~]# systemctl reload sshd.service [root@serverX~]# systemctl status sshd.service sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service: enabled) Active: active (running) since Thu 2014-02-27 18:55:09 EST: 32s ago Main PID: 1268 (sshd) CGroup: /system.slice/sshd.service └──1268 /usr/sbin/sshd -D ~~~ #### 单元依赖项 服务可能会以其他服务依赖项的形式启动。如果套接字单元已启用,但名称相同的服务单元没有启动,对该网络套接字发出请求时将自动启动该服务。服务也可能会在满足文件系统条件时由路径单元触发。 systemctl list-dependencies UNIT 命令可用于显示必须与特定单元联合启动的其他单元的树。此命令的 --reverse 选项将显示哪些单元必须要在指定单元启动后才能运行。 #### 屏蔽服务 系统可能针对某一特定功能安装了有冲突的服务,如防火墙(iptables 和 firewalld)。为防止管理员意外启动某一服务,可以屏蔽该服务。屏蔽将在配置目录中创建链接,使得启动该服务时什么也不会发生。 ~~~ [root@serverX~]# systemctl mask network ln -s '/dev/null' '/etc/systemd/system/network.service' [root@serverX~]# systemctl unmask network rm '/etc/systemd/system/network.service' ~~~ ### 重要 禁用的服务不会在系统启动时自动启动,也不会被其他单元文件启动,但可以手动启动。屏蔽的服务无法手动启动,也不会自动启动。 ## 使系统守护进程在系统启动时启动或停止 当相应的 systemd 配置目录中创建有链接时,服务会在系统启动时启动。这些链接可以通过 systemctl 命令创建和删除。 * 查看服务的状态 ~~~ [root@serverX~]# systemctl status sshd.service ~~~ * 禁用服务并验证其状态。请注意禁用服务不会停止该服务。 ~~~ [root@serverX~]# systemctl disable sshd.service [root@serverX~]# systemctl status sshd.service ~~~ * 启用服务并验证其状态。 ~~~ [root@serverX~]# systemctl enable sshd.service [root@serverX~]# systemctl is-enabled sshd.service ~~~ ## systemctl 命令摘要 可以在运行中的系统上启动和停止服务,也可以启用或禁用服务在系统启动时自动启动。 |命令 |任务 | | --- | --- | |systemctl status UNIT | 查看有关单元状态的详细信息 | |systemctl stop UNIT | 在运行中的系统上停止一项服务 | |systemctl start UNIT | 在运行中的系统上启动一项服务 | |systemcl restart UNIT | 在运行中的系统上重新启动一项服务 | |systemctl reload UNIT | 重新加载运行中服务的配置文件 | |systemctl mask UNIT | 彻底禁用服务,使其无法手动启动或在系统启动时启动 | |systemctl unmask UNIT | 使屏蔽的服务变为可用 | |systemctl enable UNIT | 将服务配置为在系统启动时启动 | |systemctl disable UNIT | 禁止服务在系统启动时启动 | |systemctl list-dependencis UNIT | 列出指定单元需要的单元 |