Systemd学习记录

字号
字体
版心
外观
天空

Systemd学习记录

I

Incohua

•21 分钟阅读

前言#

🙇观前提示:作者在撰写过程中,调整了结构数次,如有跳跃逻辑不清之处,还请谅解

作者一直在使用 systemd 进行管理 Linux 的进程,但是却没有去细致了解过运行原理和架构。

所以决定搜一搜,学一学,看一看。

有很多前辈们讲的非常好,所以这篇文章呢,很多地方都是 CV的。

正文#

1. 介绍#

这里引用自官方原话

systemd 是一套 Linux 系统的基本构件。它提供了一个系统和服务管理器,作为 PID 1 运行,并启动系统的其他部分。
systemd 支持 SysV 和 LSB 启动脚本,并可替代 sysvinit。
其他部分包括日志守护进程,用于控制主机名、日期、地域等基本系统配置的实用程序,维护登录用户、运行容器和虚拟机、系统账户、运行时目录和设置的列表,以及管理简单网络配置、网络时间同步、日志转发和名称解析的守护进程。

偷了一个图

2. 系统管理#

systemd 是一组命令,设计到系统管理的方方面面

2.1 systemctl#

systemctl 是 Systemd 的主命令,用于管理系统。

bash
# 重启系统
$ 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命令用于查看启动耗时。

bash
# 查看启动耗时
$ systemd-analyze

# 查看每个服务的启动耗时
$ systemd-analyze blame

# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain

# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service

这里测试一手

2.3 hostnamectl#

hostnamectl命令用于查看当前主机的信息。

bash
# 显示当前主机的信息
$ hostnamectl

# 设置主机名。
$ sudo hostnamectl hostname <new-hostname>

2.4 localectl#

localectl命令用于查看本地化设置。

bash
# 查看本地化设置
$ 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

bash
## 安装中文手册页包
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 命令显示中文,而不改变整个系统的语言设置,可以创建一个别名

学好英语不是更好吗 (作者是语言苦手😭

bash
alias cman='LANG=zh_CN.UTF-8 man'

这样输入 cman <option> 就能查看对应命令的中文手册

2.5 timedatectl#

bash
# 查看当前时区设置
$ 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命令用于查看当前登录的用户。

bash
# 列出当前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#

查资料的时候,看到有篇文讲的很好, 这里给原话搬过来
《一篇搞懂》系列之三——systemd
Target 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 就好比启动到某种状态。

bash
# 查看当前系统的所有 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 。

bash
# 列出正在运行的 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> 可以查看配置文件:

ini
# ==============================
# 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 命令可以查看配置文件的内容。

bash
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 进行查看。


bash
# 列出所有配置文件
$ 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

ini
[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 是否已经读取到

bash
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>

我们测试一下,可以清晰看到各种状态:

bash
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 测试服务#

服务启动了就测试一手

bash
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 的配置。

bash
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 并在文本编辑器中打开它。你添加到该文件中的任何内容都将添加到现有的服务文件中。

添加自定义配置,例如

ini
[Service]
ExecStartPost=/bin/echo "HTTP 服务已经启动在 8888 端口"

检查一下:

bash
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 端口"

要替换可多次设置的选项,必须先清除该选项,否则覆盖文件将第二次添加该选项。

ini
[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-reloadsystemd 重新读取修改过的 Unit 文件
status查看运行状态和日志
show查看所有底层属性
set-property动态设置属性
journalctl -u查看服务日志
1. 管理服务开机启动#
bash
# 设置开机启动该服务(Enable 会创建符号链接到对应 target 的 wants 目录)
sudo systemctl enable simplehttp.service

# 取消开机启动(Disable 会删除符号链接)
sudo systemctl disable simplehttp.service

# 设置开机启动该服务并立即启动
sudo systemctl enable simplehttp.service --now

示例:

bash
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. 启动 / 停止 / 重启 / 杀死#
bash
# 立即启动服务
sudo systemctl start simplehttp.service

# 立即停止服务
sudo systemctl stop simplehttp.service

# 重启服务
sudo systemctl restart simplehttp.service

# 杀死该服务的所有子进程(类似于强制终止)
sudo systemctl kill simplehttp.service

📌 kill 会根据 Unit 配置里的 KillMode 决定是杀掉主进程还是全部子进程(默认是全部)。

3. 重新加载配置#
bash
# 让服务重新加载自己的配置文件,不停止进程(需要服务支持 reload)
sudo systemctl reload simplehttp.service

# 当 Unit 文件或 override.conf 修改过时,重载 systemd 自己的配置数据库
sudo systemctl daemon-reload

📌 注意:reload 是让服务自己重新读配置,daemon-reload 是让 systemd 本身重新读 Unit 文件。如果你改了 Unit 文件,一定要 daemon-reload。

4. 查看服务信息#
bash
# 显示该服务 Unit 的完整运行时属性(所有字段)
systemctl show simplehttp.service

# 只查看某个指定属性的值(例如 CPU 共享权重)
systemctl show -p CPUShares simplehttp.service

# 人类可读的状态摘要(最常用)
systemctl status simplehttp.service

📌 status 会给你当前运行状态、进程 ID、日志信息;show 适合脚本解析。

除了 status 命令,systemctl 还提供了三个查询状态的简单方法,主要供脚本内部的判断语句使用。

bash
# 显示某个 Unit 是否正在运行
$ systemctl is-active application.service
# 显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service
# 显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service
5. 修改运行时属性#
bash
# 设置某个 Unit 的指定属性(立即生效,可选持久化)
sudo systemctl set-property simplehttp.service CPUShares=500

📌 属性写入后,如果想持久保存,建议通过 systemctl edit 写入 override. Conf;否则可能在重启 systemd 后丢失。

6. 其他常用补充命令#
bash
# 查看该服务的最近日志(由 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 的状态。

text
# 显示系统状态
$ systemctl status

# 显示单个 Unit 的状态
$ sysystemctl status sshd.service

# 显示远程主机的某个 Unit 的状态
$ systemctl -H test@blog.inmoe.org status httpd.service

5. Journalctl日志服务#

一个合格的程序员要学会看日志

Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用 journalctl 一个命令,查看所有日志(内核日志和应用日志)。

日志的配置文件是/etc/systemd/journald.conf。

bash
# 查看所有日志(默认情况下 ,只保存本次启动的日志)
$ 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 的东西很多时都写的非常棒!参考别人的文章,终究是吸取别人的理解,而不是自己的理解。

希望我也能做到写文引人入胜,一层套一层。

写草稿,写大纲是对的)

参考致谢#

评论 0

按时间排序
评论还没开通
  1. 还没有评论。