跳到主要内容

停止服务器

blocklet server stop 命令会优雅地关闭正在运行的 Blocklet Server 实例。此过程包括停止所有正在运行的 blocklet、路由引擎、核心服务器进程以及任何关联的 Docker 容器。

用法

基本用法

bash
blocklet server stop [options]

优雅停机流程

默认情况下,运行 blocklet server stop 会启动一个顺序关闭过程,以确保所有服务都能干净地终止并防止数据损坏。服务器有 5 分钟的超时时间来完成此过程。

下图说明了该流程:

Stop Server

优雅停机的关键步骤如下:

  1. 检查开发模式的 Blocklet

    服务器首先检查是否有任何 blocklet 正在以开发模式运行。如果有,停止命令将失败,您必须先手动停止开发过程。

  2. 通知客户端

    广播 NODE_STOPPED 事件,以通知任何连接的 Web 仪表板用户即将关闭。

  3. 停止路由引擎

    服务器的路由引擎被停止。

  4. 停止 Blocklet

    每个正在运行的 blocklet 都被单独停止。

  5. 停止核心进程

    由 PM2 管理的主要 Blocklet Server 进程(daemonserviceevent-hub)被终止。

  6. 停止 Docker 容器

    由 Blocklet Server 管理的任何 Docker 容器都将被停止。

  7. 更新状态

    服务器的状态更新为 STOPPED

选项

选项描述
--force强制停止所有与 Blocklet Server 相关的进程。此选项会绕过优雅停机序列,应在服务器无法正常停止时使用。

强制停止

使用 --force 标志会启动一个更激进的关闭过程,超时时间为 20 秒。此过程将:

  • 立即清除所有路由器配置和缓存。
  • 直接终止与 Blocklet Server 和任何 blocklet 相关的所有 PM2 进程。
  • 终止 PM2 主守护进程本身。
  • 停止任何受管的 Docker 容器。

当服务器无响应且优雅停机命令超时时,这是推荐的解决方案。

示例

标准优雅停机

要执行服务器的标准、优雅停机:

基本停止命令

bash
blocklet server stop

您将看到指示每个组件成功关闭的输出:

预期输出

text
Sending shutdown notification to web dashboard users ✔
Routing engine is stopped successfully ✔
Blocklet My-Blocklet is stopped successfully ✔
...
daemon is stopped successfully ✔
service is stopped successfully ✔
event-hub is stopped successfully ✔
Docker containers managed by blocklet server are stopped ✔
Done! ✔

强制停止服务器

如果服务器无响应或优雅停机失败,请使用 --force 标志。

强制停止命令

bash
blocklet server stop --force

此命令将尝试直接停止所有相关进程。

强制停止的预期输出

text
nginx router is stopped successfully ✔
All blocklet processes stopped successfully ✔
Docker containers managed by blocklet server are stopped ✔

故障排查

开发模式下的 Blocklet

如果您有以开发模式运行的 blocklet(使用 blocklet dev),blocklet server stop 命令将失败,并显示类似以下的消息:

开发模式下的错误消息

text
Unable to stop Blocklet Server, please stop the development by pressing Ctrl + C in the terminal of my-dev-blocklet

您必须导航到运行开发进程的终端,并按 Ctrl + C 来停止它,然后才能停止主服务器。

服务器停止失败

如果优雅停机过程耗时过长(默认超时为 5 分钟),您将看到一条错误消息。在这种情况下,您应该使用强制停止命令:

超时错误消息

text
Blocklet Server failed to stop within 5 minutes
You can stop blocklet server with blocklet stop --force