.   . . .  .头像

systemd: Linux 系统的服务管理器

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

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--