From f6afcd5cc264d2faf951144b8a0d512ee466972a Mon Sep 17 00:00:00 2001 From: stswangzhiping <59632378+stswangzhiping@users.noreply.github.com> Date: Sun, 5 Apr 2026 09:12:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=20restartGateway?= =?UTF-8?q?=EF=BC=8Copenclaw.json=20=E5=8D=95=E6=AC=A1=E5=86=99=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gateway 自动检测文件变更并重启,clawd 无需主动 kill。 同时去掉 applyFullProviderFromVps 的预清理写盘, 改为拉完模型后一次性写入,避免 gateway 读到中间状态。 Made-with: Cursor --- lib/openclaw-provider.js | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/lib/openclaw-provider.js b/lib/openclaw-provider.js index 1eaeda2..92a7362 100644 --- a/lib/openclaw-provider.js +++ b/lib/openclaw-provider.js @@ -4,7 +4,6 @@ const fs = require('fs'); const path = require('path'); const http = require('http'); const https = require('https'); -const { exec } = require('child_process'); const log = require('./logger'); const { resolveOpenclawConfigFile } = require('./frpc'); @@ -14,23 +13,6 @@ const FETCH_TIMEOUT_MS = 10_000; /** 拉模型 + 写盘单次飞行:进行中则忽略新的 apply/remove */ let _busy = false; -/** - * 终止 openclaw-gateway 进程,由 systemd --user 自动重新拉起以读取新配置。 - * 每次写盘 openclaw.json 成功后应调用一次。 - * 使用异步 exec,不阻塞 Node.js 事件循环,避免干扰 LED / VFD 等后续操作。 - */ -function restartGateway() { - exec('pkill -9 -x openclaw-gateway', (err) => { - if (err && err.code !== 1) { - log.warn('openclaw-provider', `restartGateway: ${err.message}`); - } else if (!err) { - log.info('openclaw-provider', 'openclaw-gateway 已终止,等待自动重启'); - } else { - log.info('openclaw-provider', 'openclaw-gateway 进程不存在,无需终止'); - } - }); -} - function buildModelsUrl(baseUrl) { let u = String(baseUrl || '').trim().replace(/\/+$/, ''); if (!/\/v1$/.test(u)) u = `${u}/v1`; @@ -103,6 +85,7 @@ function writeJsonFile(filePath, obj) { /** * 同步:从 openclaw.json 删除指定 provider(解绑)。 * 若 primary 指向该 provider,先置为空串。 + * gateway 检测到文件变更后会自动重启,无需 clawd 主动 kill。 */ function removeProviderByName(providerId) { if (_busy) { @@ -143,7 +126,6 @@ function removeProviderByName(providerId) { writeJsonFile(configFile, config); log.info('openclaw-provider', `provider 已移除: ${providerId}`); - restartGateway(); } function removeProviderFromConfig(config, providerId) { @@ -209,7 +191,8 @@ function addProviderSync(configFile, providerId, baseUrl, apiKey, models, defaul } /** - * VPS 绑定:先同步删掉同名 provider,再异步拉模型,回调内同步 add。完成后执行 onDone(如更新 origin)。 + * VPS 绑定:异步拉模型后一次性写入 openclaw.json。 + * gateway 检测到文件变更后会自动重启,无需 clawd 主动 kill。 */ function applyFullProviderFromVps(provider, onDone) { if (_busy) { @@ -233,15 +216,6 @@ function applyFullProviderFromVps(provider, onDone) { } _busy = true; - try { - const cfg = readJsonFile(configFile); - removeProviderFromConfig(cfg, name); - writeJsonFile(configFile, cfg); - } catch (e) { - log.warn('openclaw-provider', `apply 预清理失败: ${e.message}`); - _busy = false; - return; - } fetchModels(baseUrl, apiKey, (err, models) => { try { @@ -257,7 +231,6 @@ function applyFullProviderFromVps(provider, onDone) { log.warn('openclaw-provider', `onDone: ${e.message}`); } } - restartGateway(); } catch (e) { log.error('openclaw-provider', `apply 写配置失败: ${e.message}`); } finally {