Systemd学习记录
前言
🙇观前提示:作者在撰写过程中,调整了结构数次,如有跳跃逻辑不清之处,还请谅解
作者一直在使用 systemd 进行管理 Linux 的进程,但是却没有去细致了解过运行原理和架构。
所以决定搜一搜,学一学,看一看。
有很多前辈们讲的非常好,所以这篇文章呢,很多地方都是 CV的。
正文
1. 介绍
这里引用自官方原话
systemd 是一套 Linux 系统的基本构件。它提供了一个系统和服务管理器,作为 PID 1 运行,并启动系统的其他部分。
systemd 支持 SysV 和 LSB 启动脚本,并可替代 sysvinit。
其他部分包括日志守护进程,用于控制主机名、日期、地域等基本系统配置的实用程序,维护登录用户、运行容器和虚拟机、系统账户、运行时目录和设置的列表,以及管理简单网络配置、网络时间同步、日志转发和名称解析的守护进程。
偷了一个图

2. 系统管理
systemd 是一组命令,设计到系统管理的方方面面
2.1 systemctl
systemctl 是 Systemd 的主命令,用于管理系统。
# 重启系统
$ sudo systemctl reboot
# 关闭系统,切断电源
$ sudo systemctl poweroff
# CPU停止工作
$ sudo systemctl halt
# 暂停系统
$ sudo systemctl suspend
# 让系统进入冬眠状态
$ sudo systemctl hibernate
# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep
# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue
2.2 systemd-analyze
这个命令我还真非常少用
systemd-analyze命令用于查看启动耗时。
# 查看启动耗时
$ systemd-analyze
# 查看每个服务的启动耗时
$ systemd-analyze blame
# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain
# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service
这里测试一手

2.3 hostnamectl
hostnamectl命令用于查看当前主机的信息。
# 显示当前主机的信息
$ hostnamectl
# 设置主机名。
$ sudo hostnamectl hostname <new-hostname>

2.4 localectl
localectl命令用于查看本地化设置。
# 查看本地化设置
$ localectl
# 设置本地化参数。
$ sudo localectl set-locale LANG=en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
$ sudo localectl set-keymap en_US
说个题外话,如果把参数调整成中文的话,使用 man 可以很方便的查阅命令要如何使用
项目地址: manpages-zh
## 安装中文手册页包
sudo apt update
sudo apt install manpages-zh
echo -e "export LANG=zh_CN.UTF-8\nexport LC_ALL=zh_CN.UTF-8" >> ~/.bashrc ##写入的位置取决于你使用什么终端
source ~/.bashrc
如果你只想让 man 命令显示中文,而不改变整个系统的语言设置,可以创建一个别名
学好英语不是更好吗 (作者是语言苦手😭
alias cman='LANG=zh_CN.UTF-8 man'
这样输入 cman <option> 就能查看对应命令的中文手册

2.5 timedatectl
# 查看当前时区设置
$ timedatectl
# 显示所有可用的时区
$ timedatectl list-timezones
# 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS

💡:其实作者的文章很多都是翘课的时候写的
2.6 loginctl
loginctl命令用于查看当前登录的用户。
# 列出当前session
$ loginctl list-sessions
# 列出当前登录用户
$ loginctl list-users
# 列出显示指定用户的信息
$ loginctl show-user root
3. Unit(单元)
3.1 Unit 介绍
Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单元)。
3.2 Unit 的类型
Unit 共分为 12 种。
| 单元类型 | 文件后缀 | 描述 |
|---|---|---|
| Service | .service | 定义了系统服务,包括启动,重启,关闭服务的相关指令 |
| Target | .target | 定义了一组单元的集合,通常作为单元启动的同步点,某个target启动成功就意味着一组相关的service启动成功 |
| Automount | .automount | 定义了系统引导时会进行自动挂载的挂载点 |
| Device | .device | 定义了由systemd管理的硬件设备 |
| Mount | .mount | 定义了由systemd管理的文件系统挂载点 |
| Path | .path | 定义了一条用于基于路径激活服务的文件路径。例如,可以基于某一条文件路径的状态(是否存在等)来启动某个服务。 |
| Scope | .scope | 定义了来自systemd总线接口的信息,通常用来管理额外的系统进程 |
| Slice | .slice | 定义了资源限额,基于Linux cgroup nodes实现。 |
| Snapshot | .snapshot | 定义了一次当前的systemd状态,通常在对systemd做修改后回滚使用 |
| Socket | .socket | 定义了进程间通信使用的socket,往往socket会与service相关联 |
| Swap | .swap | 定义了系统中的交换空间 |
| Timer | .timer | 定义了一个定时激活另一个单元的定时器 |
3.3 Unit 之间的依赖关系
Unit 之间并非孤立,它们通过依赖关系组织在一起。
依赖关系:systemd 通过 Wants 和 Requires 等指令定义依赖。例如,A Wants B,意味着启动 A 的时候,systemd 也会尝试启动 B。Requires 则是更强的“必须”依赖。
Target:Target 是一种特殊的 Unit,它本身不执行任何操作,而是作为一个“单元组”的引用点。例如,multi-user.target 包含了所有在多用户命令行模式下需要运行的服务和单元。当系统进入 multi-user.target 状态时,systemd 会确保该 Target 依赖的所有 Unit 都已启动。
3.4 Target
查资料的时候,看到有篇文讲的很好, 这里给原话搬过来
《一篇搞懂》系列之三——systemdTarget Unit理解起来并不难,它就是一组Units的集合。这就跟学生时代升旗仪式一样,每个班(Target)有很多学生(Units),只有当每位学生(Units)都到齐之后,这个班(Target)才允许进入操场。当所有的班(Target)都进入操场后,升旗仪式(default. Target)才会进行。
所以,在 systemd 架构下,系统的启动方式可以这样理解:systemd 通过 default. Target 来启动系统,什么时候 default. Target 准备就绪,系统就认为启动成功。
启动计算机的时候,需要启动大量的 Unit。如果每一次启动,都要一一写明本次启动需要哪些 Unit,显然非常不方便。Systemd 的解决方案就是 Target。
简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target 这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态。
# 查看当前系统的所有 Target
$ systemctl list-unit-files --type=target
# 查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target
# 查看启动时的默认 Target
$ systemctl get-default
# 设置启动时的默认 Target
$ sudo systemctl set-default multi-user.target
# 切换 Target 时,默认不关闭前一个 Target 启动的进程,
# systemctl isolate 命令改变这种行为,
# 关闭前一个 Target 里面所有不属于后一个 Target 的进程
$ sudo systemctl isolate multi-user.target

3.5 Unit 配置文件
3.5.1 概述
在 Systemd 中,每一个 Unit(单元)都有一个配置文件,用来告诉 Systemd 该如何启动和管理这个 Unit。
单元文件是 ini 风格的纯文本文件。封装了有关下列对象的信息: 服务 (service)、套接字 (socket)、设备 (device)、挂载点 (mount)、自动挂载点 (automount)、启动目标 (target)、交换分区或交换文件 (swap)、被监视的路径 (path)、任务计划 (timer)、资源控制组 (slice)、一组外部创建的进程 (scope)。
我们来看看系统有哪些 Unit:
systemctl list-units 命令可以查看当前系统的所有 Unit 。
# 列出正在运行的 Unit
$ systemctl list-units
# 列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all
# 列出所有没有运行的 Unit
$ systemctl list-units --all --state=inactive
# 列出所有加载失败的 Unit
$ systemctl list-units --failed
# 列出所有正在运行的、类型为 service 的 Unit
$ systemctl list-units --type=service

接下来,我们以 nginx 为例,查看其 Unit 的配置文件
systemctl cat <unit.service> 可以查看配置文件:
# ==============================
# Unit 部分:定义服务的基本信息和依赖关系
# ==============================
[Unit]
Description=A high performance web server and a reverse proxy server
# Description:服务的描述信息,会在 systemctl status 等命令中显示
Documentation=man:nginx(8)
# Documentation:指向帮助文档的位置,这里是 nginx 的 man 手册页
After=network-online.target remote-fs.target nss-lookup.target
# After:表示这个服务要在这些目标(其他服务)启动之后再启动
# network-online.target → 网络连接准备就绪
# remote-fs.target → 远程文件系统挂载完成
# nss-lookup.target → 主机名解析服务就绪
Wants=network-online.target
# Wants:表示这个服务希望 network-online.target 同时启动
# "Wants" 是一种弱依赖,如果目标服务失败,本服务仍会启动
# ==============================
# Service 部分:定义服务具体如何运行和管理
# ==============================
[Service]
Type=forking
# Type:服务启动类型
# forking → 父进程启动后会派生(fork)一个子进程,父进程退出,子进程继续运行
PIDFile=/run/nginx.pid
# PIDFile:记录 nginx 主进程 PID 的文件路径
# 用于 systemd 检查并控制服务状态
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
# ExecStartPre:启动主命令前执行的命令
# 此处执行 nginx 语法检查 -t (加 -q 表示安静模式,只显示错误)
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
# ExecStart:实际启动 nginx 的命令
# -g 参数用于临时设置运行配置(这里让 nginx 在后台运行并启用主进程管理)
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
# ExecReload:重新加载配置时执行的命令
# -s reload 使 nginx 平滑重启,重新应用配置文件而不中断服务
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
# ExecStop:停止服务的命令
# -(开头的减号)表示忽略命令的执行错误
# start-stop-daemon 用来发送 QUIT 信号给 nginx 主进程,最多等待 5 秒进行优雅停止
TimeoutStopSec=5
# TimeoutStopSec:等待服务结束的时间(秒),超过时间会强制杀死进程
KillMode=mixed
# KillMode:杀死进程的策略
# mixed → 同时向主进程和所有子进程发信号
# ==============================
# Install 部分:定义如何启用服务
# ==============================
[Install]
WantedBy=multi-user.target
# WantedBy:指定启用服务时创建符号链接的目标
# multi-user.target → 表示在多用户命令行(非图形模式)环境下启动
# 这也是常见的默认运行级别
从上文可以看出,配置文件主要分为三个区块,内容以键值对呈现。
以下为 Unit 配置文件的详细介绍文章:
3.2.2 Unit 配置文件存储的位置
Systemd 默认会从目录 /etc/systemd/system/ 读取配置文件。不过,这个目录中的很多文件并不是实际的配置内容,而是 符号链接(快捷方式),它们指向 /usr/lib/systemd/system/ 目录中的真正配置文件。
/usr/lib/systemd/system/→ 存放系统提供的、真实的服务配置文件/etc/systemd/system/→ 存放用户或系统在运行时创建的符号链接(以及可能的自定义文件)、./system/启动系统服务(数据库、Web、网络服务)如:nginx./user/运行用户脚本、桌面程序自动启动、会话守护进程如:my-script.sh
3.2.3 Unit 的格式
单元配置文件这里只做部分的简述,这里可以去到详细介绍的文章
systemctl cat 命令可以查看配置文件的内容。
root@test-orb-debian:~ # systemctl cat ssh
# /lib/systemd/system/ssh.service
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
Alias=sshd.service
systenctl edit 可以覆盖更改
3.4 Unit 配置文件的状态
我们可以使用 systemctl list-unit-files 命令用于列出所有配置文件。
列表会显示出各种配置文件及状态。
但是具体状态需要使用 systemctl status 进行查看。

# 列出所有配置文件
$ systemctl list-unit-files
# 列出serivce类型的配置文件
$ systemctl list-unit-files --type=service
配置文件的各种状态:
| 状态 | 含义 | 说明 |
|---|---|---|
| enabled | 启用 | 在对应 target 下有符号链接,开机自动启动 |
| enabled-runtime | 临时启用 | 链接在 /run/systemd/system 下,重启后消失 |
| linked | 链接启用 | unit 不在标准路径下,而是被符号链接到 systemd 搜索路径中(持久) |
| linked-runtime | 临时链接启用 | 同上,但临时(位于 /run/systemd/system) |
| disabled | 禁用 | 没有符号链接到任何 target,需要手动启动 |
| static | 静态 | 无 [Install] 段,无法直接 enable/disable,仅作为依赖启动 |
| masked | 屏蔽 | unit 文件被符号链接到 /dev/null 永久禁止启动 |
| masked-runtime | 临时屏蔽 | 屏蔽符号链接在 /run/systemd/system,重启后恢复 |
| alias | 别名 | 该 unit 是另一个 unit 的别名(常见于服务提供者) |
| generated | 生成的 | 由 systemd 动态从其它配置生成的 unit,通常存放在 /run/systemd/generator.* |
| transient | 临时单元 | 运行时通过 D-Bus/systemd-run 创建,存活到运行结束 |
| bad | 无效 | 单元文件无效或损坏(配置格式错误、文件不存在等) |
4. Unit 的管理
4.1 实践:创建并管理一个自己的服务
多说无益,让我们动手实操,写一个试试
4.1.1 创建 Unit 配置文件
路径: /etc/systemd/system/simplehttp.service
[Unit]
Description=My Simple HTTP Service
[Service]
ExecStart=/usr/bin/python3 -m http.server 8888
Restart=on-failure
[Install]
WantedBy=multi-user.target
这是一个使用 python3 在 8888 端口启动 http 服务的配置文件。
4.1.2 管理服务生命周期
刚刚我们写了一个用于测试的 Unit 配置,但是还没有启动
现在我们要先手动使用 systemctl daemon-reload 加载配置
然后查看一下 systemd 是否已经读取到
root@test-orb-debian:~ # sudo systemctl list-units -all -t service | grep simple
simplehttp.service loaded inactive dead My Simple HTTP Service
可以看到,服务已经加载进来了 (loaded),且并没有启动 (inactive dead),此外,我们还可以看到我们给服务写的描述 (My Simple HTTP Service)。
- 想要服务立即启动
systemctl start <servicename>
- 设置开机自启并立即启动
systemctl enable --now <servicename>
- 查看服务状态
systemctl status <servicename>
我们测试一下,可以清晰看到各种状态:
root@test-orb-debian:~ # systemctl disable simplehttp.service
Removed "/etc/systemd/system/multi-user.target.wants/simplehttp.service".
root@test-orb-debian:~ # systemctl enable simplehttp.service --now
Created symlink /etc/systemd/system/multi-user.target.wants/simplehttp.service → /etc/systemd/system/simplehttp.service.
root@test-orb-debian:~ # systemctl status simplehttp.service
● simplehttp.service - My Simple HTTP Service
Loaded: loaded (/etc/systemd/system/simplehttp.service; enabled; preset: enabled)
Drop-In: /run/systemd/system/service.d
└─zzz-lxc-service.conf
Active: active (running) since Tue 2025-10-14 21:16:45 CST; 9min ago
Main PID: 8430 (python3)
Tasks: 1 (limit: 9593)
Memory: 13.2M
CPU: 227ms
CGroup: /system.slice/simplehttp.service
└─8430 /usr/bin/python3 -m http.server 8888
10月 14 21:16:45 test-orb-debian systemd[1]: Started simplehttp.service - My Simple HTTP Service.
4.1.3 测试服务
服务启动了就测试一手
root@test-orb-debian:~ # systemctl start simplehttp
root@test-orb-debian:~ # systemctl status simplehttp
● simplehttp.service - My Simple HTTP Service
Loaded: loaded (/etc/systemd/system/simplehttp.service; enabled; preset: enabled)
Drop-In: /run/systemd/system/service.d
└─zzz-lxc-service.conf
Active: active (running) since Tue 2025-10-14 21:49:41 CST; 7s ago
Main PID: 10090 (python3)
Tasks: 1 (limit: 9593)
Memory: 21.9M
CPU: 56ms
CGroup: /system.slice/simplehttp.service
└─10090 /usr/bin/python3 -m http.server 8888
10月 14 21:49:41 test-orb-debian systemd[1]: Started simplehttp.service - My Simple HTTP Service.
root@test-orb-debian:~ # netstat -ltpn | grep 8888
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 10090/python3
root@test-orb-debian:~ # curl localhost:8888
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Directory listing for /</title>
...
接着我们使用 systemctl status, 可以发现一条日志, 到此我们已经完成了一个 Unit 的配置。
10月 14 21:49:41 test-orb-debian systemd[1]: Started simplehttp.service - My Simple HTTP Service.
10月 14 21:50:14 test-orb-debian python3[10090]: 127.0.0.1 - - [14/Oct/2025 21:50:14] "GET / HTTP/1.1" 200 -
4.1.4 修改服务
📌 属性写入后,如果想持久保存,建议通过 systemctl edit 写入 override. Conf;否则可能在重启 systemd 后丢失。
以 simplehttp 为例:systemctl edit simplehttp 会创建一个覆盖文件 /etc/systemd/system/simplehttp.service.d/override.conf 并在文本编辑器中打开它。你添加到该文件中的任何内容都将添加到现有的服务文件中。
添加自定义配置,例如
[Service]
ExecStartPost=/bin/echo "HTTP 服务已经启动在 8888 端口"

检查一下:
root@test-orb-debian:~ # systemctl cat simplehttp
# /etc/systemd/system/simplehttp.service
[Unit]
Description=My Simple HTTP Service
[Service]
ExecStart=/usr/bin/python3 -m http.server 8888
Restart=on-failure
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/simplehttp.service.d/override.conf
[Service]
ExecStartPost=/bin/echo "HTTP 服务已经启动在 8888 端口"
要替换可多次设置的选项,必须先清除该选项,否则覆盖文件将第二次添加该选项。
[Service]
ExecStart=
ExecStart=<new command>
保存文件。systemd 会自动加载新的服务配置。
之后使用 systemd restart 重启服务即可

⚠️:如果要完全替换服务
使用systemctl edit --full,例如systemctl edit --full simplehttp.service。这样会创建/etc/systemctl/system/simplehttp.service,取代现有的服务文件。
4.2 Unit 的部分常用命令
systemd命令 | 作用 |
|---|---|
enable | 设置开机自动启动 |
disable | 取消开机自动启动 |
start | 立即启动 |
stop | 立即停止 |
restart | 停止并重启 |
kill | 杀死服务及子进程 |
reload | 不停止服务,重新加载配置(服务需支持) |
daemon-reload | systemd 重新读取修改过的 Unit 文件 |
status | 查看运行状态和日志 |
show | 查看所有底层属性 |
set-property | 动态设置属性 |
journalctl -u | 查看服务日志 |
1. 管理服务开机启动
# 设置开机启动该服务(Enable 会创建符号链接到对应 target 的 wants 目录)
sudo systemctl enable simplehttp.service
# 取消开机启动(Disable 会删除符号链接)
sudo systemctl disable simplehttp.service
# 设置开机启动该服务并立即启动
sudo systemctl enable simplehttp.service --now
示例:
root@test-orb-debian:~ # systemctl disable simplehttp.service
Removed "/etc/systemd/system/multi-user.target.wants/simplehttp.service".
root@test-orb-debian:~ # systemctl enable simplehttp.service --now
Created symlink /etc/systemd/system/multi-user.target.wants/simplehttp.service → /etc/systemd/system/simplehttp.service.
root@test-orb-debian:~ # systemctl status simplehttp.service
● simplehttp.service - My Simple HTTP Service
Loaded: loaded (/etc/systemd/system/simplehttp.service; enabled; preset: enabled)
Drop-In: /run/systemd/system/service.d
└─zzz-lxc-service.conf
Active: active (running) since Tue 2025-10-14 21:16:45 CST; 9min ago
Main PID: 8430 (python3)
Tasks: 1 (limit: 9593)
Memory: 13.2M
CPU: 227ms
CGroup: /system.slice/simplehttp.service
└─8430 /usr/bin/python3 -m http.server 8888
10月 14 21:16:45 test-orb-debian systemd[1]: Started simplehttp.service - My Simple HTTP Service.
📌 注意:enable / disable 改的是开机时自动启动与否,不影响当前是否正在运行。
要立即启动,需要用 start。
2. 启动 / 停止 / 重启 / 杀死
# 立即启动服务
sudo systemctl start simplehttp.service
# 立即停止服务
sudo systemctl stop simplehttp.service
# 重启服务
sudo systemctl restart simplehttp.service
# 杀死该服务的所有子进程(类似于强制终止)
sudo systemctl kill simplehttp.service
📌 kill 会根据 Unit 配置里的 KillMode 决定是杀掉主进程还是全部子进程(默认是全部)。
3. 重新加载配置
# 让服务重新加载自己的配置文件,不停止进程(需要服务支持 reload)
sudo systemctl reload simplehttp.service
# 当 Unit 文件或 override.conf 修改过时,重载 systemd 自己的配置数据库
sudo systemctl daemon-reload
📌 注意:reload 是让服务自己重新读配置,daemon-reload 是让 systemd 本身重新读 Unit 文件。如果你改了 Unit 文件,一定要 daemon-reload。
4. 查看服务信息
# 显示该服务 Unit 的完整运行时属性(所有字段)
systemctl show simplehttp.service
# 只查看某个指定属性的值(例如 CPU 共享权重)
systemctl show -p CPUShares simplehttp.service
# 人类可读的状态摘要(最常用)
systemctl status simplehttp.service
📌 status 会给你当前运行状态、进程 ID、日志信息;show 适合脚本解析。
除了 status 命令,systemctl 还提供了三个查询状态的简单方法,主要供脚本内部的判断语句使用。
# 显示某个 Unit 是否正在运行
$ systemctl is-active application.service
# 显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service
# 显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service
5. 修改运行时属性
# 设置某个 Unit 的指定属性(立即生效,可选持久化)
sudo systemctl set-property simplehttp.service CPUShares=500
📌 属性写入后,如果想持久保存,建议通过 systemctl edit 写入 override. Conf;否则可能在重启 systemd 后丢失。
6. 其他常用补充命令
# 查看该服务的最近日志(由 journald 保存)
journalctl -u simplehttp.service
# 持续跟踪日志输出(类似 tail -f)
journalctl -u simplehttp.service -f
# 检查当前服务是否已启用开机启动
systemctl is-enabled simplehttp.service
# 检查服务是否正在运行
systemctl is-active simplehttp.service
# 列出当前所有已启动的服务
systemctl list-units --type=service --state=running
# 查找一个服务的文件路径(在哪个目录)
systemctl cat simplehttp.service
7. 总结
enable / disable 管开机启动,start / stop / restart 管当前状态,reload / daemon-reload 管配置刷新,show / set-property 管属性配置。日志用 journalctl -u 查。
systemctl status 命令用于查看系统状态和单个 Unit 的状态。
# 显示系统状态
$ systemctl status
# 显示单个 Unit 的状态
$ sysystemctl status sshd.service
# 显示远程主机的某个 Unit 的状态
$ systemctl -H [email protected] status httpd.service

5. Journalctl日志服务
一个合格的程序员要学会看日志
Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用 journalctl 一个命令,查看所有日志(内核日志和应用日志)。
日志的配置文件是/etc/systemd/journald.conf。
# 查看所有日志(默认情况下 ,只保存本次启动的日志)
$ sudo journalctl
# 查看内核日志(不显示应用日志)
$ sudo journalctl -k
# 查看系统本次启动的日志
$ sudo journalctl -b
$ sudo journalctl -b -0
# 查看上一次启动的日志(需更改设置)
$ sudo journalctl -b -1
# 查看指定时间的日志
$ sudo journalctl --since="2025-10-1 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2025-10-1" --until "2025-10-5 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"
# 显示尾部的最新10行日志
$ sudo journalctl -n
# 显示尾部指定行数的日志
$ sudo journalctl -n 20
# 实时滚动显示最新日志
$ sudo journalctl -f
# 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd
# 查看指定进程的日志
$ sudo journalctl _PID=1
# 查看某个路径的脚本的日志
$ sudo journalctl /usr/bin/bash
# 查看指定用户的日志
$ sudo journalctl _UID=33 --since today
# 查看某个 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today
# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f
# 合并显示多个 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today
# 查看指定优先级(及其以上级别)的日志,共有8级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b
# 日志默认分页输出,--no-pager 改为正常的标准输出
$ sudo journalctl --no-pager
# 以 JSON 格式(单行)输出
$ sudo journalctl -b -u nginx.service -o json
# 以 JSON 格式(多行)输出,可读性更好
$ sudo journalctl -b -u nginx.serviceqq
-o json-pretty
# 显示日志占据的硬盘空间
$ sudo journalctl --disk-usage
# 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G
# 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years
思考
回顾过去,我写文章更多是为了记录——记录当时的思路,或者简单记下自己学到的知识。很多时候,并不是我已经真正理解透了,而只是先把东西写下来。
这次写文的过程让我有坡有些“便秘”。一边查资料,一边码字,写着写着就发现:前辈的文章写得真好,不知不觉就开始“这里搬一点,那里抄一点”。结果,文章缺少了属于我自己的主线和思考。
写到一半时,感觉越来越不对劲。于是我决定停下手来,把相关的内容全部重新梳理一遍——从头阅读、理解,再结合自己的思路和记忆,把文章重写。
当我最终用自己的话写出来时,过程虽然慢,但收获很大。不仅对内容理解得更深,也更清楚地意识到:写作不仅是记录,更是一次重新思考与内化的过程。
真得多写字,多社交,多说话。作者已经到了表达不出来自己的话,有时候需要 ai 润色表达出来了😭 明明我是
ENFP啊,怎么变成小阿宅了
码字学东西的时候还有个很重要的点,一定要多查资料翻资料,官方 Wiki 的东西很多时都写的非常棒!参考别人的文章,终究是吸取别人的理解,而不是自己的理解。
希望我也能做到写文引人入胜,一层套一层。
写草稿,写大纲是对的)