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

课程目标
- 掌握 systemctl 命令管理服务。
- 掌握自定义
.service文件编写。 - 掌握 journalctl 日志查看方法。
一、Systemd 是什么?
Systemd 是 Linux 系统的初始化系统(init system)和服务管理器,PID 为 1,是系统中所有进程的父进程。

| 对比项 | 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 文件。
三、实战案例:部署 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

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]> *************************************************************

启动后访问 http://服务器IP:8080,看到 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]> *************************************************************

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

# 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 访问日志 |
| 各应用自定义位置 | 五花八门 |

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 的核心优势在于:日志是结构化 + 索引的,可以按任意字段精确过滤。

按进程名过滤(_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

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。
评论