systemctl · 服务管家

上游:sudo(管理服务必须 sudo)· ps(理解进程才能理解服务)· shell-script(服务本质上是自动运行的脚本) 下游:(Tier 4 终点,后续扩展见 Tier 5) 参见:cron(定时任务)· kill(紧急时手动结束进程)


一句话是什么

systemctl 管理 Linux 的系统服务——启动、停止、重启、开机自启, 就像一个总控台,管着所有后台运行的程序。


为什么需要它

你现在每次开机都要手动进终端运行 ./bedrock_server, 如果 Aaron 的笔记本重启了,服务器就断了,小伙伴连不上。

systemctl 让服务器开机自动启动,就算重启也不用管:

sudo systemctl enable mc-server    # 设置开机自启
sudo systemctl start mc-server     # 立刻启动

以后笔记本每次开机,Minecraft 服务器自动在后台跑起来。


核心用法

公式

sudo systemctl [动作] [服务名]

常用命令表

操作命令说明
启动服务sudo systemctl start 服务名立刻启动
停止服务sudo systemctl stop 服务名立刻停止
重启服务sudo systemctl restart 服务名停止再启动
查看状态sudo systemctl status 服务名是否运行、日志尾部
开机自启sudo systemctl enable 服务名下次开机自动启动
取消自启sudo systemctl disable 服务名开机不再自动启动
查看所有服务systemctl list-units --type=service列出所有服务

服务文件(.service)

要让 systemctl 管理 Minecraft 服务器,需要写一个服务描述文件:

# 文件位置:/etc/systemd/system/mc-server.service
 
[Unit]
Description=Minecraft Bedrock Server
After=network.target
 
[Service]
Type=simple
User=aaron
WorkingDirectory=/home/aaron/mc-server
# 关键:Environment 让 bedrock_server 能找到自带的 .so 共享库
Environment="LD_LIBRARY_PATH=/home/aaron/mc-server"
ExecStart=/home/aaron/mc-server/bedrock_server
Restart=on-failure
 
[Install]
WantedBy=multi-user.target

⚠️ LD_LIBRARY_PATH 是什么:bedrock_server 运行时需要加载同目录下的 libCrypto.so.3 等库文件。 系统默认不去程序所在目录找,这一行告诉系统:「也去 /home/aaron/mc-server 找」。 不加的话服务会立刻失败,状态变成 activating (auto-restart) (Result: exit-code)


Linux 笑话

Aaron 正在打 Minecraft,突然 iPad 提示”已掉出服务器”。 他紧张地找爸爸:「服务器挂了!」

爸爸:sudo systemctl restart mc-server Aaron:「好了!爸爸你修好了!」 爸爸:「我没修好什么,我只是让它重启了一遍。」 Aaron:「那问题呢?」 爸爸:「大部分问题重启就自己好了。实在不好再去看日志。」


这是运维工程师的公开秘密:重启是第一招,不是最后一招。

Linux 的服务设计思路是:写好服务文件 → 交给 systemd 管 → 崩了自动重启(Restart=on-failure),大部分时候根本不用人管。


例题精讲

📗 初探 Starter — 查看系统服务状态

# 查看 ssh 服务的状态(Aaron 笔记本上应该在运行)
sudo systemctl status ssh
 
# 输出大概是:
# ● ssh.service - OpenBSD Secure Shell server
#      Loaded: loaded (/lib/systemd/system/ssh.service)
#      Active: active (running) since ...
#     Process: ExecStart=/usr/sbin/sshd -D
#   Main PID: 1234 (sshd)
 
# 查看所有正在运行的服务(前 20 个)
systemctl list-units --type=service --state=running | head -20

📘 应用 User — 注册 Minecraft 服务器为系统服务

# 第一步:创建服务文件
sudo nano /etc/systemd/system/mc-server.service
 
# 写入内容(把 aaron 改成你的用户名):
[Unit]
Description=Minecraft Bedrock Server
After=network.target
 
[Service]
Type=simple
User=aaron
WorkingDirectory=/home/aaron/mc-server
Environment="LD_LIBRARY_PATH=/home/aaron/mc-server"
ExecStart=/home/aaron/mc-server/bedrock_server
Restart=on-failure
RestartSec=5
 
[Install]
WantedBy=multi-user.target
 
# 第二步:重新加载 systemd(让它读取新文件)
sudo systemctl daemon-reload
 
# 第三步:启动服务
sudo systemctl start mc-server
 
# 第四步:查看状态
sudo systemctl status mc-server
 
# 第五步:设置开机自启
sudo systemctl enable mc-server

📙 管理 Admin — 完整的服务管理流程

# 查看服务日志(最近 50 行)
sudo journalctl -u mc-server -n 50
 
# 实时跟踪日志(Ctrl+C 停止)
sudo journalctl -u mc-server -f
 
# 服务崩溃后手动重启
sudo systemctl restart mc-server
 
# 更新了 bedrock_server 程序后,重启服务生效
sudo systemctl stop mc-server
# (替换 bedrock_server 文件)
sudo systemctl start mc-server
 
# 查看服务是否设置了开机自启
systemctl is-enabled mc-server
# enabled  ← 是
# disabled ← 否

官方文档参考

man systemctl    # 完整手册
systemctl --help # 快速选项

systemctl 是 systemd 的控制工具;服务描述文件放在 /etc/systemd/system/,修改后需要 daemon-reload。 在线:https://manpages.ubuntu.com/systemctl


节点链接

上游(理解服务之前需要这些)

  • sudo ← 管理服务必须有管理员权限
  • ps ← 服务本质是特殊管理的进程
  • shell-script← 服务的 ExecStart 指向脚本或程序

同层

  • cron ← 定时任务,与服务是两种自动化方式
  • kill ← 紧急情况下绕过 systemctl 直接终止进程

日志查看

  • grep ← journalctl 输出可以用 grep 过滤

实战


节点版本:v1.0 · 2026-04-20 Tier 4 终点节点——学完这个,Phase 4 自动化阶段完成