# 运行与生命周期

每个启用的插件拥有一个独立的 Node.js 后台进程。飞块提供运行时和 SDK 路径，插件入口负责加载 SDK 并调用 `definePlugin()`。

## 启动

SDK 注册处理函数后，调用 `onStart(context)`。这个函数完成后，SDK 发送就绪信息，飞块核对实际注册的动作、服务和超级块处理函数。

初始化失败时，后台报告错误，插件不会进入运行状态。因此，把必要的连接和初始数据加载放在 `onStart()` 中，让失败直接暴露在启动阶段。定时更新可以在初始化成功后启动定时器。

```js
let timer;
definePlugin({
  async onStart(context) {
    await refresh(context);
    timer = setInterval(() => refresh(context).catch(console.error), 5000);
  },
  onStop() {
    clearInterval(timer);
  }
});
```

这里的 `refresh()` 由插件实现，用于获取并发布数据。

## 停止

用户禁用插件或飞块退出时，宿主请求后台停止，SDK 调用 `onStop()`。在这里关闭连接、清理定时器和完成必要的资源释放。

## 异常退出

后台崩溃或失去响应时，飞块把插件标记为错误，结束正在等待的请求，并清理插件发布的状态。用户重新启用后，会启动新的进程，重新运行 `onStart()`。

需要跨重启保存业务数据时，插件自行保存业务数据，并在下次启动时恢复和重新发布。进程内变量随着进程结束而丢失。
