systemd 可以拆成 system + d:
- system:系统。
- d:
daemon(守护进程)的首字母。
Linux/Unix 中,守护进程是在后台持续运行、提供服务的程序,名字常以 d 结尾,比如 sshd(SSH 服务)。因此,systemd 这个名字可以理解为 “系统守护进程”。
systemd 是 Linux 系统的服务管理器,负责系统启动,以及服务进程的启动、停止、异常恢复和运行管理。 在当前项目里,它负责让 Egg 后端作为服务器上的常驻服务运行。
为什么会有 systemd
过去 Linux 常通过启动脚本管理服务,需要处理启动顺序、后台运行、进程状态和停止清理等问题。systemd 将这些管理规则统一成配置文件,并提供统一命令操作。
对你的项目来说,执行 Egg 启动命令只是第一步,生产环境还需要处理:
| 问题 | 当前 systemd 配置如何解决 |
|---|---|
| 服务器重启后,谁启动后端? | 启用服务后,开机自动启动 |
| 后端主进程异常退出怎么办? | Restart=on-failure,等待 3 秒重新启动 |
| 在哪里运行、使用什么环境? | 固定工作目录、生产环境变量和端口 |
| 如何统一启动、停止、重启? | 使用 systemctl |
| 停止时如何处理子进程? | KillMode=control-group,统一处理服务内的进程 |
| 退出一直卡住怎么办? | 最多等待 30 秒,超时后默认强制终止 |
当前项目中的执行关系
服务器开机 / 你执行命令 / 发布脚本重启
|
v
systemd
|
读取 .service 配置
|
v
在 /opt/shopping-guide/server 下运行
eggctl start --workers=1
|
v
Egg 后端提供接口
这里有三个容易混淆的概念:
| 名称 | 是什么 | 当前项目中的职责 |
|---|---|---|
systemd | 服务管理器 | 按配置启动和管理后端进程 |
systemctl | 操作 systemd 的命令行工具 | 让你启动、停止、重启和查看服务 |
.service | 服务单元配置文件 | 告诉 systemd 怎么管理这个后端 |
当前配置文件分为三部分:
[Unit]:服务说明和启动顺序,例如安排在网络目标、Docker 服务之后启动。[Service]:运行目录、环境变量、Egg 启动命令,以及重启和停止规则。[Install]:执行enable时如何接入系统启动流程。
[Unit]
Description=Shopping Guide Egg4 Server
After=network.target docker.service
[Service]
Type=simple
WorkingDirectory=/opt/目录/server
Environment=NODE_ENV=production
Environment=EGG_SERVER_ENV=prod
Environment=PORT=7001
ExecStart=/opt/目录/server/node_modules/.bin/eggctl start --workers=1
Restart=on-failure
RestartSec=3
KillMode=control-group
TimeoutStopSec=30
[Install]
WantedBy=multi-user.target
它和 Egg、Docker 有什么区别
Egg 启动命令负责启动应用;systemd 管理该启动进程的生命周期。二者配合使用,所以当前文件里仍然需要写 Egg 的启动命令。
Docker 则提供容器运行环境,也有进程重启策略。项目提供了两种后端部署方式:
宿主机部署:systemd → Egg
容器部署: Docker → Egg
按项目现有方案选择其中一种即可。
日常最常用的命令
# 设置开机自启,并立即启动
sudo systemctl enable --now shopping-guide-server
# 查看状态
sudo systemctl status shopping-guide-server
# 重启 / 停止
sudo systemctl restart shopping-guide-server
sudo systemctl stop shopping-guide-server
# 持续查看输出日志
sudo journalctl -u shopping-guide-server -f
# 修改 .service 文件后,重新加载配置,再重启应用
sudo systemctl daemon-reload
sudo systemctl restart shopping-guide-server
需要注意它的管理边界:当前配置能在主进程异常退出后重启,但不能判断“进程还活着,接口却已卡住”;After=docker.service 也不保证 MySQL 已就绪。项目发布脚本另外请求 /health/ready,就是为了检查后端是否真正可以提供服务。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/yexudengzhidao/article/details/169269729



