Day 6-2 Systemd 服务管理

Day 6-2 Systemd 服务管理 掌握 systemd 服务管理工具,能够管理系统服务、自定义服务单元、查看日志。 课程目标 掌握 systemctl 命令管理服务。 掌握自定义 .service 文件编写。 掌握 journalctl 日志查看方法。 一、Systemd 是什么? Syst

Day 6-2 Systemd 服务管理

掌握 systemd 服务管理工具,能够管理系统服务、自定义服务单元、查看日志。

systemd

课程目标

  • 掌握 systemctl 命令管理服务。
  • 掌握自定义 .service 文件编写。
  • 掌握 journalctl 日志查看方法。

一、Systemd 是什么?

Systemd 是 Linux 系统的初始化系统(init system)和服务管理器,PID 为 1,是系统中所有进程的父进程。

systemd(PID 1)管理系统服务、并行启动服务、通过 journald 管理日志

对比项 SysVinit(旧) systemd(新)
启动方式 顺序启动(慢) 并行启动(快)
服务管理 service、chkconfig systemctl
日志管理 /var/log/ 文本日志 journald 统一管理

二、systemctl 命令

2.1 服务管理命令

操作 命令 说明
启动 systemctl start nginx 立即启动
停止 systemctl stop nginx 立即停止
重启 systemctl restart nginx 先停止再启动
重载配置 systemctl reload nginx 不中断服务
查看状态 systemctl status nginx 运行状态 + 日志
开机自启 systemctl enable nginx 创建符号链接
禁用自启 systemctl disable nginx 删除符号链接
检查是否启用 systemctl is-enabled nginx enabled/disabled

2.2 常用示例

安装 Nginx:

# Rocky 10
[root@magedu ~]# dnf install -y nginx

# Ubuntu 26.04
[root@magedu ~]# apt install -y nginx

管理 Nginx 服务:

# 启动 nginx
[root@magedu ~]# systemctl start nginx

# 查看状态
[root@magedu ~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled)
   Active: active (running) since Mon 2026-07-20 14:30:25 CST

# 开机自启
[root@magedu ~]# systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

# 禁用自启
[root@magedu ~]# systemctl disable nginx

# 重载配置(修改 nginx.conf 后使用)
[root@magedu ~]# systemctl reload nginx

reload 和 restart 的区别:

  • reload:不中断服务,重新加载配置文件,适用于 Nginx、sshd 等支持热加载的服务。
  • restart:先停止再启动,会中断服务。

2.3 enable 的原理

graph LR
    A["/usr/lib/systemd/system/nginx.service"] -->|"systemctl enable"| B["/etc/systemd/system/multi-user.target.wants/nginx.service"]
    style A fill:#ccffff,stroke:#00aaaa,color:#2C3E50
    style B fill:#ffffcc,stroke:#aaaa00,color:#2C3E50

systemctl enable 创建符号链接,系统启动时自动启动该服务。

2.4 什么情况需要手动创建 service?

包管理器安装的软件,自动带 service 文件,直接用即可:

[root@magedu ~]# dnf install -y nginx
[root@magedu ~]# systemctl start nginx    # 直接用,无需手写
[root@magedu ~]# ls /usr/lib/systemd/system/nginx.service
/usr/lib/systemd/system/nginx.service

需要手动创建 service 的场景:

场景 举例
源码编译安装 ./configure && make && make install
手动下载的二进制包 Prometheus、Grafana
手动部署的 Java 应用 Jenkins WAR 包、若依 JAR 包
自己写的脚本/程序 备份脚本、Python 应用

按安装方式判断是否需要手动创建 service

判断标准:用包管理器装的软件,默认就有 service。自己下载的、自己编译的、自己写的,才需要手动创建 service 文件。

三、实战案例:部署 Jenkins

使用 Jenkins WAR 包演示 Java 应用部署,无需安装 MySQL 和 Redis,开箱即用。

3.1 安装 JDK 25

提示:Jenkins 需要 JDK 11 或更高版本,我们统一使用 JDK 25。软件包有点大,建议提前更换为国内源。

# Rocky 10
[root@magedu ~]# dnf install -y java-25-openjdk-headless

# Ubuntu 26.04
[root@magedu ~]# apt install -y openjdk-25-jdk-headless

# 验证
[root@magedu ~]# java -version
openjdk version "25.0.3" 2026-04-21 LTS
OpenJDK Runtime Environment (Red_Hat-25.0.3.0.9-1) (build 25.0.3+9-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-25.0.3.0.9-1) (build 25.0.3+9-LTS, mixed mode, sharing)

root@yangge:~# java -version
openjdk version "25.0.3" 2026-04-21
OpenJDK Runtime Environment (build 25.0.3+9-2-24.04.2-Ubuntu)
OpenJDK 64-Bit Server VM (build 25.0.3+9-2-24.04.2-Ubuntu, mixed mode, sharing)

3.2 下载 Jenkins

# 创建 Jenkins 目录
[root@magedu ~]# mkdir -p /opt/jenkins

# 下载 Jenkins WAR 包(清华镜像源,速度快)
[root@magedu ~]# wget -O /opt/jenkins/jenkins.war https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/latest/jenkins.war

# 查看下载的文件
root@yangge:~# ls -lh /opt/jenkins/
-rw-r--r-- 1 root root 97M Jul 9 23:42 jenkins.war

清华镜像站的 Jenkins war-stable 下载目录

3.3 演示一:直接启动(java -jar)

Jenkins WAR 包可以直接用 java -jar 启动。

[root@magedu ~]# cd /opt/jenkins
[root@magedu ~]# java -jar jenkins.war
root@yangge:/opt/jenkins# java -jar jenkins.war
Running from: /opt/jenkins/jenkins.war
webroot: /root/.jenkins/war
2026-07-23 05:07:48.786+0000 [id=3] INFO winstone.Logger#logInternal: Beginning extraction from war file
2026-07-23 05:07:49.237+0000 [id=3] WARNING o.e.j.ee9.nested.ContextHandler#setContextPath: Empty contextPath
2026-07-23 05:07:49.291+0000 [id=3] INFO org.eclipse.jetty.server.Server#doStart: jetty-12.1.8; built: 2026-04-01T01:09:18.991Z; git: c9cdc9aaa434a3665b8a53b4d1cc3684992da649; jvm 25.0.3+9-2-24.04.2-Ubuntu
2026-07-23 05:07:49.680+0000 [id=3] INFO o.e.j.e.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.ee9.jsp.JettyJspServlet
2026-07-23 05:07:49.750+0000 [id=3] INFO o.e.j.s.DefaultSessionIdManager#doStart: Session workerName=node0
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by com.thoughtworks.xstream.converters.reflection.SunUnsafeReflectionProvider (file:/root/.jenkins/war/WEB-INF/lib/xstream-1.4.21.jar)
WARNING: Please consider reporting this to the maintainers of class com.thoughtworks.xstream.converters.reflection.SunUnsafeReflectionProvider
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
2026-07-23 05:07:50.194+0000 [id=3] INFO hudson.WebAppMain#contextInitialized: Jenkins home directory: /root/.jenkins found at: $user.home/.jenkins
2026-07-23 05:07:50.369+0000 [id=3] INFO o.e.j.s.handler.ContextHandler#doStart: Started oeje9n.ContextHandler$CoreContextHandler@6ee8dcd3{Jenkins v2.568.1,/,b=file:///root/.jenkins/war/,a=AVAILABLE,h=oeje9n.ContextHandler$CoreContextHandler$CoreToNestedHandler@a20b94b{STARTED}}
2026-07-23 05:07:50.396+0000 [id=3] INFO o.e.j.server.AbstractConnector#doStart: Started oejs.ServerConnector@45d6ef73{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2026-07-23 05:07:50.399+0000 [id=3] INFO org.eclipse.jetty.server.Server#doStart: Started oejs.Server@1f6d27cc{STARTING}[12.1.8,sto=0] @1110ms
2026-07-23 05:07:50.401+0000 [id=34] INFO winstone.Logger#logInternal: Winstone Servlet Engine running: controlPort=disabled
2026-07-23 05:07:50.529+0000 [id=33] INFO jenkins.model.Jenkins#<init>: Starting version 2.568.1
2026-07-23 05:07:50.645+0000 [id=43] INFO jenkins.InitReactorRunner$1#onAttained: Started initialization
2026-07-23 05:07:50.662+0000 [id=43] INFO jenkins.InitReactorRunner$1#onAttained: Listed all plugins
2026-07-23 05:07:51.310+0000 [id=43] INFO jenkins.InitReactorRunner$1#onAttained: Prepared all plugins
2026-07-23 05:07:51.314+0000 [id=41] INFO jenkins.InitReactorRunner$1#onAttained: Started all plugins
2026-07-23 05:07:51.318+0000 [id=41] INFO jenkins.InitReactorRunner$1#onAttained: Augmented all extensions
2026-07-23 05:07:51.470+0000 [id=41] INFO jenkins.InitReactorRunner$1#onAttained: System config loaded
2026-07-23 05:07:51.471+0000 [id=41] INFO jenkins.InitReactorRunner$1#onAttained: System config adapted
2026-07-23 05:07:51.472+0000 [id=43] INFO jenkins.InitReactorRunner$1#onAttained: Loaded all jobs
2026-07-23 05:07:51.474+0000 [id=43] INFO jenkins.InitReactorRunner$1#onAttained: Configuration for all jobs updated
2026-07-23 05:07:51.507+0000 [id=58] INFO hudson.util.Retrier#start: Attempt #1 to do the action check updates server
2026-07-23 05:07:51.843+0000 [id=43] INFO jenkins.install.SetupWizard#init:
[LF]>
[LF]> *************************************************************
[LF]> *************************************************************
[LF]> *************************************************************
[LF]>
[LF]> Jenkins initial setup is required. An admin user has been created and a password generated.
[LF]> Please use the following password to proceed to installation:
[LF]>
[LF]> 0ba21e9c86cb470d8daff75ded044ece
[LF]>
[LF]> This may also be found at: /root/.jenkins/secrets/initialAdminPassword
[LF]>
[LF]> *************************************************************
[LF]> *************************************************************
[LF]> *************************************************************

java -jar 前台运行,Ctrl+C 停止

启动后访问 http://服务器IP:8080,看到 Jenkins 解锁页面说明启动成功。

Jenkins 解锁页面及初始密码文件位置

root@yangge:~# cat /root/.jenkins/secrets/initialAdminPassword
0ba21e9c86cb470d8daff75ded044ece

Rocky 最小化安装缺少字体

# 启动失败
[root@magedu ~]# java -jar /opt/jenkins/jenkins.war
2026-07-22 17:55:49.022+0000 [id=3] SEVERE hudson.util.BootFailure#publish: Failed to initialize Jenkins
java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration
    at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1242)
    at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:207)

# 安装字体和字体配置工具
yum install -y fontconfig dejavu-sans-fonts dejavu-serif-fonts

[root@magedu ~]# java -jar /opt/jenkins/jenkins.war
2026-07-22 18:02:39.758+0000 [id=43] INFO jenkins.install.SetupWizard#init:
[LF]>
[LF]> *************************************************************
[LF]> *************************************************************
[LF]> *************************************************************
[LF]>
[LF]> Jenkins initial setup is required. An admin user has been created and a password generated.
[LF]> Please use the following password to proceed to installation:
[LF]>
[LF]> 219c875a3747485b9de2e900cbf59708
[LF]>
[LF]> This may also be found at: /root/.jenkins/secrets/initialAdminPassword
[LF]>
[LF]> *************************************************************
[LF]> *************************************************************
[LF]> *************************************************************

Jenkins 自定义页面

Rocky 防火墙和 SELinux

[root@magedu ~]# firewall-cmd --permanent --add-port=8080/tcp
success
[root@magedu ~]# firewall-cmd --reload
success
[root@magedu ~]# firewall-cmd --permanent --list-all
public (default)
  target: default
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces:
  sources:
  services: cockpit dhcpv6-client ssh
  ports: 8080/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

3.4 演示二:Systemd 服务

# 创建服务文件
[root@magedu ~]# vim /etc/systemd/system/jenkins.service
[Unit]
Description=Jenkins Continuous Integration Server
After=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/opt/jenkins
ExecStart=/usr/bin/java -jar /opt/jenkins/jenkins.war
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

service 文件各部分说明:

配置项 含义
Description 服务描述,systemctl status 时显示
After=network.target 网络就绪后再启动,避免因网络未初始化导致启动失败
Type=simple 默认类型,表示前台进程(Java 程序直接运行在前台)
User=jenkins 指定运行用户,不使用 root 更安全
Group=jenkins 指定运行组
WorkingDirectory 工作目录
ExecStart 启动命令(必须用绝对路径)
Restart=on-failure 非正常退出时自动重启
RestartSec=10 重启前等待 10 秒
WantedBy=multi-user.target 属于 multi-user.target,开机自启

3.5 启动并验证

# 重新加载 systemd 配置(修改服务文件后必须执行)
[root@magedu ~]# systemctl daemon-reload

# 启动服务
[root@magedu ~]# systemctl start jenkins

# 开机自启
[root@magedu ~]# systemctl enable jenkins

# 查看状态
[root@magedu ~]# systemctl status jenkins.service
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/etc/systemd/system/jenkins.service; enabled; preset: disabled)
     Active: active (running) since Thu 2026-07-23 02:28:32 CST; 14s ago
 Invocation: cb277b492bf34a6ababa320e97ed79e3
   Main PID: 4394 (java)
      Tasks: 29 (limit: 22696)
     Memory: 138.7M (peak: 138.9M)
        CPU: 2.234s
     CGroup: /system.slice/jenkins.service
             └─4394 /usr/bin/java -jar /opt/jenkins/jenkins.war

# 查看监听的端口
[root@magedu ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State  PID/Program name
tcp        0      0 0.0.0.0:22    0.0.0.0:*       LISTEN 1057/sshd: /usr/sbi
tcp6       0      0 :::8080        :::*            LISTEN 4394/java
tcp6       0      0 :::22          :::*            LISTEN 1057/sshd: /usr/sbi

3.6 演示:崩溃自动重启

Restart=on-failure 的意思是:当服务进程非正常退出时,systemd 会自动重启它。

[root@magedu ~]# systemctl cat jenkins.service
# /etc/systemd/system/jenkins.service
[Unit]
Description=Jenkins Continuous Integration Server
After=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/opt/jenkins
ExecStart=/usr/bin/java -jar /opt/jenkins/jenkins.war
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

Systemd 服务后台运行,支持开机自启和崩溃后自动重启

# 1. 确认服务正在运行
[root@magedu ~]# systemctl status jenkins.service
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/etc/systemd/system/jenkins.service; enabled; preset: disabled)
     Active: active (running) since Thu 2026-07-23 02:28:32 CST; 5min ago

# 2. 找到进程 PID
[root@magedu ~]# ps aux | grep jenkins.war | grep -v grep
root 4394 2.3 11.3 3802996 420072 ? Ssl 02:28 0:09 /usr/bin/java -jar /opt/jenkins/jenkins.war

# 3. 强制杀掉进程(模拟崩溃)
[root@magedu ~]# kill -9 4394

# 4. 等待几秒后再次查看状态——进程已经自动恢复
[root@magedu ~]# systemctl status jenkins.service
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/etc/systemd/system/jenkins.service; enabled; preset: disabled)
     Active: active (running) since Thu 2026-07-23 02:35:30 CST; 3s ago
 Invocation: c79a65c7d1ec426b82174396277b68b2
   Main PID: 4709 (java)    # 新的 PID,已自动重启
      Tasks: 29 (limit: 22696)
     Memory: 141.3M (peak: 141.5M)
        CPU: 2.208s
     CGroup: /system.slice/jenkins.service
             └─4709 /usr/bin/java -jar /opt/jenkins/jenkins.war
退出情况 是否重启
进程正常退出(exit 0) ❌ 不重启
进程非正常退出(exit 非 0) ✅ 重启
进程被信号终止(如 kill -9) ✅ 重启
进程被系统 OOM Killer 杀掉 ✅ 重启

3.7 两种方式对比

对比项 java -jar Systemd 服务
运行方式 前台 后台
开机自启 ❌ ✅
崩溃自动重启 ❌ ✅
生产环境 ❌ 不推荐 ✅ 推荐

四、journalctl 日志查看

在 Systemd 时代,所有服务的日志由 systemd-journald 统一收集、统一存储,而 journalctl 就是查询这些日志的统一入口。掌握 journalctl,等于掌握整个系统的日志排查能力。

4.1 为什么是 journalctl?

传统 Linux 日志分散在各处,排查问题要翻多个文件:

传统日志文件 记录内容
/var/log/messages 系统通用日志
/var/log/secure 认证安全日志
/var/log/cron 定时任务日志
/var/log/nginx/access.log Nginx 访问日志
各应用自定义位置 五花八门

Systemd 日志统一入口与传统分散日志的对比

journalctl 的优势:

  • 统一入口:所有服务的日志用同一条命令查看。
  • 结构化存储:日志带字段索引,查询速度极快。
  • 优先级过滤:直接按级别(error/warning/info)筛选。
  • 时间范围:支持灵活的时间表达式。
  • 持久化可控:日志大小、保留时间可配置。

4.2 基础用法

查看服务日志

# 查看 jenkins 服务的全部日志
[root@magedu ~]# journalctl -u jenkins

# 查看最近 50 行
[root@magedu ~]# journalctl -u jenkins -n 50

# 实时跟踪(最常用,类似 tail -f)
[root@magedu ~]# journalctl -u jenkins -f

按优先级过滤

# 只看错误级别以上的日志
[root@magedu ~]# journalctl -u jenkins -p err

# 查看警告及以上
[root@magedu ~]# journalctl -u jenkins -p warning

按时间范围过滤

# 相对时间
[root@magedu ~]# journalctl -u jenkins --since "1 hour ago"

# 组合起止时间
[root@magedu ~]# journalctl -u jenkins --since "today" --until "now"

# 具体时间点
[root@magedu ~]# journalctl -u jenkins --since "2026-07-23 08:00:00"

4.3 字段过滤(进阶技能)

journalctl 的核心优势在于:日志是结构化 + 索引的,可以按任意字段精确过滤。

按进程名、PID、可执行文件路径、服务单元过滤日志

按进程名过滤(_COMM)

# 查看 sshd 进程的所有日志
[root@magedu ~]# journalctl _COMM=sshd

# 查看 java 进程的日志(注意:会匹配所有 Java 应用)
[root@magedu ~]# journalctl _COMM=java

按完整路径过滤(_EXE)更精确

# 精确匹配 /usr/bin/java,避免与其他 Java 程序混淆
[root@magedu ~]# journalctl _EXE=/usr/bin/java

按 PID 过滤(临时排查用)

# 查看特定 PID 的日志(PID 会变,通常用于临时排查)
[root@magedu ~]# journalctl _PID=4709

组合多个字段

# 查看某个 PID 的错误日志
[root@magedu ~]# journalctl _PID=4709 -p err

# 查看 sshd 进程今天的日志
[root@magedu ~]# journalctl _COMM=sshd --since "today"

查看所有可用的字段值

# 列出所有曾记录过的进程名(用于确认正确的 _COMM 值)
[root@magedu ~]# journalctl -F _COMM

# 列出所有服务单元
[root@magedu ~]# journalctl -F _SYSTEMD_UNIT

4.4 存储管理(运维必备)

日志存储、持久化或仅存于内存,以及按大小或时间清理归档

查看与清理日志

# 查看日志占用了多少磁盘空间
[root@magedu ~]# journalctl --disk-usage
Archived and active journals take up 1.2G in the file system.

# 清理到只剩 500M 日志
[root@magedu ~]# journalctl --vacuum-size=500M

# 清理到只保留最近 7 天
[root@magedu ~]# journalctl --vacuum-time=7d

持久化配置(生产环境必须设置)

配置文件:/etc/systemd/journald.conf。

[Journal]
# 持久化存储(生产环境推荐)
Storage=persistent

# 日志最大占用空间(防止占满磁盘)
SystemMaxUse=5G

# 系统保留空闲空间
SystemKeepFree=1G

# 日志最长保留时间
MaxRetentionSec=1month

# 归档日志是否压缩
Compress=yes

修改配置后重启生效:

[root@magedu ~]# systemctl restart systemd-journald

修改 journald.conf 后重启 systemd-journald,使配置生效

4.5 故障排查实战案例

案例一:服务运行中突然崩溃

# 1. 查看崩溃时间点的日志
[root@magedu ~]# journalctl -u jenkins --since "10 minutes ago"

# 2. 查看是否有 OOM(内存不足)相关日志
[root@magedu ~]# journalctl -u jenkins --grep "OutOfMemory|OOM"

# 3. 查看系统级别的 OOM 记录
[root@magedu ~]# journalctl -k --grep "Out of memory"

案例二:查看登录日志(安全排查)

# 查看所有 SSH 登录失败的记录
[root@magedu ~]# journalctl _COMM=sshd --grep "Failed password"

# 查看所有 SSH 登录成功的记录
[root@magedu ~]# journalctl _COMM=sshd --grep "Accepted password"

# 查看某个 IP 的访问记录
[root@magedu ~]# journalctl _COMM=sshd --grep "192.168.1.100"

4.6 命令速查

# ═══════════════════════════════════════════════════════════
#   基础查询
# ═══════════════════════════════════════════════════════════
journalctl -u jenkins             # 查看服务日志
journalctl -u jenkins -f           # 实时跟踪
journalctl -u jenkins -n 100       # 最近 100 行

# ═══════════════════════════════════════════════════════════
#   过滤(精准定位)
# ═══════════════════════════════════════════════════════════
journalctl _COMM=sshd              # 按进程名
journalctl _EXE=/usr/bin/java      # 按完整路径
journalctl _PID=4709               # 按 PID
journalctl -u jenkins -p err       # 只看错误
journalctl --since "1 hour ago"    # 时间范围

# ═══════════════════════════════════════════════════════════
#   存储管理
# ═══════════════════════════════════════════════════════════
journalctl --disk-usage            # 查看占用空间
journalctl --vacuum-size=500M      # 清理到 500M
journalctl --vacuum-time=7d        # 只保留 7 天

4.7 优先级参考

数值 名称 说明 运维建议
0 emerg 系统不可用 立即处理
1 alert 需要立即干预 立即处理
2 crit 严重错误 高优先级
3 err 错误 需要关注
4 warning 警告 可稍后处理
5 notice 正常但重要 日常查看
6 info 信息 不常看
7 debug 调试 仅开发环境

五、课后作业

必做

  • 安装 JDK 25,验证版本。
  • 下载 Jenkins WAR 包。
  • 使用 java -jar 启动 Jenkins,访问 http://IP:8080 验证。
  • 编写 Systemd 服务文件,管理 Jenkins。
  • 启用开机自启,重启验证。
  • 模拟进程崩溃,验证 systemd 自动重启。

简答题

1. systemctl restart 和 systemctl reload 有什么区别?

restart 先停止再启动,会中断服务;reload 不中断服务重新加载配置文件,适用于 Nginx、sshd 等支持热加载的服务。

2. 修改了服务文件后,为什么要执行 systemctl daemon-reload?

systemd 不会自动检测服务文件的变更,执行 daemon-reload 让 systemd 重新读取所有服务文件,使修改生效。

3. Restart=on-failure 在什么情况下会触发重启?什么情况下不会?

触发重启:进程非正常退出(exit 非 0)、被信号终止(如 kill -9)、被 OOM Killer 杀掉。

不触发重启:进程正常退出(exit 0)。

4. systemctl enable 做了什么?

在 /etc/systemd/system/multi-user.target.wants/ 目录下创建指向服务文件的符号链接,使系统启动时自动启动该服务。

5. 如何查看一个服务的日志?

journalctl -u 服务名,实时追踪用 journalctl -u 服务名 -f。

评论