Linux - 系统服务管理(Systemd)
Systemd
是 Linux 系统里用来**启动和管理服务(daemon)**的工具,是大多数现代 Linux 发行版(如 Ubuntu、CentOS、Debian、Fedora)默认的初始化系统。
简单说,它就是你系统启动后,第一个跑起来的进程(PID 1),负责启动系统中其他的服务和进程,比如网络、SSH、数据库等等。
🌱 Systemd 的核心概念
概念 | 解释 |
Unit(单元) | Systemd 的核心对象,管理不同类型的系统资源。比如服务( |
Service | 最常用的 unit 类型,用于定义和管理服务(后台运行的程序)。比如 |
Target | 是一组 unit 的集合,比如 |
🛠 常用命令大全
以下命令都使用 systemctl
工具来操作:
▶️ 启动/停止服务
############################ nginx 案例 ##################################
# 启动服务
sudo systemctl start nginx
# 停止服务
sudo systemctl stop nginx
# 重启服务
sudo systemctl restart nginx
# 开启服务自启
sudo systemctl enable nginx
# 关闭服务自启
sudo systemctl disable nginx
# 查看服务
sudo systemctl status nginx
# 重新加载服务(配置变了用这个)
sudo systemctl reload nginx
############################ firewalld 案例 ##################################
# 启动服务
sudo systemctl start firewalld
# 停止服务
sudo systemctl stop firewalld
# 重启服务
sudo systemctl restart firewalld
# 开启服务自启
sudo systemctl enable firewalld
# 关闭服务自启
sudo systemctl disable firewalld
# 查看服务
sudo systemctl status firewalld
# 重新加载服务(配置变了用这个)
sudo systemctl reload firewalld
🔁 设置开机启动
# 设置服务开机自启
sudo systemctl enable nginx
# 取消开机启动
sudo systemctl disable nginx
📋 查看服务状态
# 查看服务当前状态
systemctl status nginx
# 查看所有服务
systemctl list-units --type=service
📄 查看服务日志(journal)
# 查看最近日志
journalctl -u nginx
# 实时查看日志(像 tail -f)
journalctl -f -u nginx
📦 Systemd 服务配置文件结构(*.service)
一个 .service
文件长这样:
[Unit]
Description=My Demo Service
After=network.target
[Service]
ExecStart=/usr/bin/my-demo-app
Restart=on-failure
User=demo
[Install]
WantedBy=multi-user.target
各段作用:
[Unit]
:定义服务的描述、依赖[Service]
:定义具体怎么启动、怎么重启、用哪个用户等[Install]
:定义该服务在哪个 target 下启用(开机自动运行)
☕ 目标:让一个 Spring Boot(或任意)JAR 应用用 systemd 管理起来
比如你有一个 JAR 文件:
/opt/myapp/myapp.jar
你希望开机自动启动它,随时 start
、stop
、status
、restart
控制它,完美结合 Linux 的服务体系。
🧱 第一步:编写 .service
文件
创建一个服务配置文件,比如:
sudo touch /etc/systemd/system/myapp.service
内容如下(注意注释):
[Unit]
Description=My Java Application Service
After=network.target
[Service]
# 运行用户(建议不要用 root)
User=myuser
# 项目目录
WorkingDirectory=/opt/myapp
# 启动命令(注意 Java 路径和 JAR 路径)
ExecStart=/usr/bin/java -jar /opt/myapp/myapp.jar
# 可选:设置环境变量
Environment="JAVA_OPTS=-Xms256m -Xmx512m"
# 如果进程挂了自动重启
Restart=always
# 日志输出方式(journald)
StandardOutput=journal
StandardError=journal
# 可选:限制最大重启次数
RestartSec=10
[Install]
WantedBy=multi-user.target
⚠️ 小贴士:
User=myuser
这一行很重要,推荐创建一个单独的用户运行该服务,避免用 root。/usr/bin/java
要确认你服务器上的 Java 路径,用which java
可查。Restart=always
会在服务异常终止时自动重启,非常实用。- 如果你希望将日志输出到某个文件,也可以用
StandardOutput=file:/var/log/myapp.log
。
🔁 第二步:启用并启动服务
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 设置开机自启
sudo systemctl enable myapp
# 启动服务
sudo systemctl start myapp
# 查看运行状态
systemctl status myapp
📜 第三步:查看日志
# 查看完整日志
journalctl -u myapp
# 实时查看(类似 tail -f)
journalctl -f -u myapp
🌟 一些实用命令小贴士
# 重新加载配置(改了 .service 文件后)
sudo systemctl daemon-reload
# 列出所有开机自启服务
systemctl list-unit-files | grep enabled
# 查看当前系统运行的 target
systemctl get-default
🧠 总结一句话
Systemd 就像 Linux 的“调度总管”,负责把系统和服务安排得明明白白!
🌱系统服务管理(Systemd)从 一切内容都是文件 的角度怎么理解 ?
📁 一切皆文件的哲学
在 Unix/Linux 世界,有一句经典语录:
Everything is a file:一切内容皆是文件
就是说在 Linux 眼里,无论是硬件设备、进程、输入输出、配置,统统都表现为文件,你都可以
cat
、ls
、read
、write
。
这不仅是技术设计,也是 Linux 极简优雅的哲学基础。
🔧 那 Systemd 怎么体现这个哲学?
Systemd 是 Linux 的初始化系统和服务管理器,它完美延续了“一切皆文件”的思想。下面逐一来看:
1️⃣ 服务的配置是文件:.service
Systemd 管理的每一个服务,都是通过一个 .service
文件定义的,比如:
/lib/systemd/system/nginx.service
/etc/systemd/system/myapp.service
这些文件是纯文本文件,可以用任何编辑器打开修改,它描述了服务的行为,比如启动命令、依赖关系、用户权限等等。
你想定义个自己的服务?写个 .service
文件扔进 /etc/systemd/system/
就行了,完美贴合“一切皆文件”的思路。
2️⃣ 服务的状态是文件(符号链接)
启用服务本质是啥?其实就是创建符号链接:
/etc/systemd/system/multi-user.target.wants/nginx.service -> /lib/systemd/system/nginx.service
这就意味着:Systemd 把是否启用某个服务通过“文件是否存在或链接”来判断。
所以 enable
就是“创建链接”,disable
就是“删除链接”。是否开机自启?看文件在不在。
3️⃣ 日志是文件(Journal)
Systemd 使用自己的日志系统 journald
,它记录服务日志的方式也接近“一切皆文件”。
虽然日志不是传统意义上的文本文件,但它们存储在:
/var/log/journal/
你用 journalctl
来访问它,其实就是去“读取一个文件结构的数据”。
4️⃣ Unit 是文件(不仅是 .service)
Systemd 不止管理服务(.service
),它还可以管理:
.socket
:监听 socket 的单元.timer
:定时任务(替代 crontab).mount
:挂载点.path
:路径监视
这些全是文本文件定义的,存储在 /lib/systemd/system/
或 /etc/systemd/system/
中,配置统一、逻辑清晰、符合“一切皆文件”。
5️⃣ Systemd 的状态接口也是“文件”(D-Bus + /proc
)
虽然不是直接的文本文件,Systemd 通过 D-Bus 提供接口,也可以通过 /proc
或 /sys/fs/cgroup/systemd/
看到运行状态,进程的状态、资源限制等都能通过读文件接口获取。
✅ 总结:Systemd 如何体现“一切皆文件”?
类型 | 表现形式 | 文件路径或操作 |
服务定义 |
|
|
启动控制 | 符号链接 |
|
日志记录 | 二进制文件(journal) |
|
服务状态 | 文件系统接口 |
|
定时任务、socket | 也是文件 |
|
Systemd 的设计延续了 Unix 的哲学,把系统的行为用“文件”来定义和管理,这一点让它既统一、可编程、又可读可控。