Linux systemd 与 systemctl 命令

参考资料

  1. 如何使用 systemctl 管理服务
  2. Linux systemctl 命令
  3. 学会爱上 systemd | Linux 中国

目录

  • [一. systemd](#一. systemd)
    • [1.1 简介](#1.1 简介)
    • [1.2 `Unit`](#1.2 Unit)
    • [1.3 `WSL`中的`systemd`](#1.3 WSL中的systemd)
  • [二. systemctl](#二. systemctl)
    • [2.1 简介](#2.1 简介)
    • [2.2 服务(Service)管理](#2.2 服务(Service)管理)
      • [2.2.1 启停与重载](#2.2.1 启停与重载)
      • [2.2.2 状态查看](#2.2.2 状态查看)
      • [2.2.3 批量查看](#2.2.3 批量查看)
      • [2.2.4 配置文件查看](#2.2.4 配置文件查看)
    • [2.3 开机启动管理(Enable / Disable)](#2.3 开机启动管理(Enable / Disable))
      • [2.3.1 启用 / 禁用](#2.3.1 启用 / 禁用)
      • [2.3.2 状态查询](#2.3.2 状态查询)
      • [2.3.3 mask / unmask(强制禁止)](#2.3.3 mask / unmask(强制禁止))
    • [2.4 Unit 文件管理](#2.4 Unit 文件管理)
      • [2.4.1 文件位置](#2.4.1 文件位置)
      • [2.4.2 重载配置](#2.4.2 重载配置)
    • [2.5 Timer / Socket / 其他 Unit](#2.5 Timer / Socket / 其他 Unit)
    • [2.6 系统运行模式(Target)](#2.6 系统运行模式(Target))
    • [2.7 排障速查清单](#2.7 排障速查清单)

一. systemd

1.1 简介

systemd是现代Linux的系统与服务管理框架(init system),CentOS从7开始,Ubuntu从15.04开始使用systemd
systemd取代了传统的 init 系统和 service 命令。核心职责是:

  • 🚀 系统启动(PID 1 → 第一个启动的进程)
  • 🔧 服务管理
  • 📜 日志管理(journald)
  • ⏱ 定时任务(timer)
  • 🔌 设备、会话、网络管理

systemd的架构

⏹简化版的 systemd 启动顺序

bash 复制代码
内核
 ↓
systemd (PID 1)
 ↓
target(multi-user.target / graphical.target)
 ↓
service / socket / timer ...

1.2 Unit

systemd管理的最小单位叫Unitsystemd通过一系列的 Unit来控制系统和服务的启动。Unit又分为不同的种类:

Unit 类型 文件后缀 作用
服务 .service 后台程序(例如:ssh, nginx
定时器 .timer cron 的替代(例如:logrotate.timer
套接字 .socket 按需启动服务
设备 .device 硬件
挂载点 .mount 文件系统
目标 .target 运行级别

unit 文件位置

  • /usr/lib/systemd/system/
    • 支持 systemd 的软件,安装的时候会自动在此目录下添加一个配置文件
    • 尽量不要修改该目录下的位置
  • /etc/systemd/system/
    • 管理员自定义的unit放在此位置

⏹当执行 systemctl enable <unit> 时,systemd 会在 /etc/systemd/system/<target>.wants/ 目录下创建一个符号链接,指向该 unit 文件(通常位于 /usr/lib/systemd/system//lib/systemd/system/)。

这个链接用于在 target 激活时自动启动该 unit

1.3 WSL中的systemd

WSLWindows Subsystem for Linux)早期 不支持 systemd,这导致:

  • systemctl 不可用
  • ssh / cron / logrotate / docker 等服务无法正常以 systemd 方式运行
  • journald 不存在或不可用
  • 如果linux系统支持systemd的话,systemd会第一个启动,因此是1号线程
bash 复制代码
# 不支持 systemd 的wsl
apluser@FengYeHong-HP:~$ ps -p 1 -o pid,comm
  PID COMMAND
    1 init(Ubuntu_22.
apluser@FengYeHong-HP:~$

# 支持 systemd 的ubuntu虚拟机
apluser@ubuntu24-01:~$ ps -p 1 -o pid,comm
    PID COMMAND
      1 systemd
apluser@ubuntu24-01:~$

⏹自 WSL 0.67+ 起,官方支持 systemd,不过需要手动配置一下。

  • 下面的文件若不存在的话,手动创建
  • systemd=false改为true
bash 复制代码
apluser@FengYeHong-HP:~$ cat /etc/wsl.conf
[user]
default=apluser
[boot]
systemd=false
apluser@FengYeHong-HP:~$
  • 在windows的命令行窗口执行下面的命令,关闭wsl
bash 复制代码
wsl --shutdown
  • 重新进入wsl后,查看systemctl状态,若不报错,则说明 systemd 正常工作。
bash 复制代码
systemctl status

二. systemctl

2.1 简介

systemctl 是操作 systemd 的命令行工具,就好比 systemd 是汽车的引擎,而 systemctl 是方向盘。用于:

  • 管理服务(启动 / 停止 / 重启
  • 控制开机启动
  • 切换系统运行模式(target
  • 查看系统与服务状态
  • 查看 systemd 管理的日志
  • 执行系统级电源操作
bash 复制代码
┌───────────────────────────────┐
│           systemctl           │
│      (systemd 的遥控器)        │
└───────────────┬───────────────┘
                │
┌───────────────┼────────────────┬────────────────┐
│               │                │                │
│   服务管理     │   系统运行模式  │   系统控制     │
│  (Service)    │   (Target)     │   (Power)      │
│               │                │                │
│  start        │  isolate       │  reboot        │
│  stop         │   multi-user   │  poweroff      │
│  restart      │  isolate       │  suspend       │
│  reload       │   graphical    │  hibernate     │
│  status       │  set-default   │                │
│  list-units   │  get-default   │                │
└───────────────┼────────────────┴────────────────┘
                │
┌───────────────┼────────────────┬──────────────────────────┐
│               │                │                          │
│ 开机启动管理   │ 日志与状态查看  │      其他 Unit 管理       │
│ (Enable)      │ (Status/Log)   │                          │
│               │                │                          │
│ enable        │ status <unit>  │ .socket   (套接字)       │
│ disable       │ journalctl -u  │ .mount    (挂载点)       │
│ is-enabled    │ list-units     │ .timer    (定时任务)     │
│ mask          │ list-unit-     │ .path     (路径监控)     │
│ unmask        │  files         │ .target   (运行模式)     │
└───────────────┴────────────────┴──────────────────────────┘
  • 命令格式
bash 复制代码
systemctl 子命令 [Unit名] [配置项]

2.2 服务(Service)管理

2.2.1 启停与重载

  • restart:完整重启
  • try-restart:启动中的Unit停止后,再启动
  • reload:重新加载配置(不重启进程,需服务支持)
bash 复制代码
systemctl start <service>
systemctl stop <service>
systemctl restart <service>
systemctl try-restart <service>
systemctl reload <service>

2.2.2 状态查看

  • active (running)
  • inactive (dead)
  • failed
bash 复制代码
systemctl status <service>
  • Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: enabled)
    • loaded:unit 文件已加载
    • ssh.service:服务定义文件
    • disabled:没有 enable(未设为开机自启)
    • preset: enabled:发行版建议是 enable,支持建议值。

2.2.3 批量查看

bash 复制代码
systemctl list-units --type=service
systemctl --failed

2.2.4 配置文件查看

bash 复制代码
systemctl cat 服务名称.service

2.3 开机启动管理(Enable / Disable)

2.3.1 启用 / 禁用

⏹本质就是在 target 的 wants/ 目录中创建 / 删除符号链接

bash 复制代码
systemctl enable <service>
systemctl disable <service>

2.3.2 状态查询

⏹返回值

  • enabled
  • disabled
  • masked
bash 复制代码
systemctl is-enabled <service>

⏹可以看到我们的logrotate.timer是开机启动的

2.3.3 mask / unmask(强制禁止)

  • 禁止任何方式启动(含依赖)
  • 事故止血、临时封禁
bash 复制代码
systemctl mask <service>
systemctl unmask <service>

2.4 Unit 文件管理

2.4.1 文件位置

  • /usr/lib/systemd/system/ :软件包提供
  • /etc/systemd/system/:运维自定义

⏹推荐的编辑方式

bash 复制代码
systemctl edit <unit>

↓↓↓

# 会生成如下所示的配置文件
/etc/systemd/system/<unit>.d/override.conf

2.4.2 重载配置

  • daemon-reload:重载 unit 文件
  • daemon-reexec:重启 systemd 本身(不中断服务)
bash 复制代码
systemctl daemon-reload
systemctl daemon-reexec

2.5 Timer / Socket / 其他 Unit

⏹定时任务

bash 复制代码
systemctl list-timers
systemctl status logrotate.timer

⏹Socket

bash 复制代码
systemctl list-units --type=socket

mountpath

bash 复制代码
systemctl list-units --type=mount
systemctl list-units --type=path

2.6 系统运行模式(Target)

Target 说明
multi-user.target 多用户命令行
graphical.target 图形界面
rescue.target 单用户
emergency.target 最小救援
bash 复制代码
# 查看系统默认的运行模式
systemctl get-default
# 切换默认的运行模式
systemctl set-default multi-user.target
# isolate 会立即停止无关服务
systemctl isolate graphical.target

2.7 排障速查清单

bash 复制代码
# 服务是否存在
systemctl list-unit-files | grep <name>

# 服务是否失败
systemctl --failed

# 查看失败原因
systemctl status <unit>

# 查看详细日志
journalctl -xeu <unit>
相关推荐
公众号:ITIL之家2 小时前
服务价值体系重构:在变化中寻找不变的运维本质
java·运维·开发语言·数据库·重构
Howrun7772 小时前
不可重入函数Non-Reentrant & 可重入函数Reentrant
linux·服务器
0思必得02 小时前
[Web自动化] Requests模块请求参数
运维·前端·python·自动化·html
oMcLin2 小时前
Debian 9 高并发请求导致 Nginx 进程崩溃:调整 worker_processes 和 worker_connections 参数
运维·nginx·debian
Thera7772 小时前
Linux 核心绑定(CPU Affinity)详解:原理、方法与优缺点分析
linux·运维·服务器
不一样的故事1262 小时前
1. 公司质量体系的维护与申办监管•
大数据·运维·人工智能
小鹏linux2 小时前
【linux】进程与服务管理命令 - setup
linux·运维·服务器
倔强的石头1062 小时前
【Linux指南】进程控制系列(二)进程终止 —— 退出场景、方法与退出码详解
linux·运维·服务器
爱吃生蚝的于勒2 小时前
【Linux】零基础深入学习动静态库+深入学习地址
linux·运维·服务器·c语言·数据结构·c++·学习