feat: restart openclaw-gateway after openclaw.json write (v1.3.7)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
stswangzhiping
2026-05-05 22:11:46 +08:00
parent d89c2340da
commit 6c1c0cf955
2 changed files with 24 additions and 1 deletions

View File

@@ -5,6 +5,7 @@ const path = require('path');
const http = require('http'); const http = require('http');
const https = require('https'); const https = require('https');
const crypto = require('crypto'); const crypto = require('crypto');
const { exec } = require('child_process');
const log = require('./logger'); const log = require('./logger');
const { resolveOpenclawConfigFile } = require('./frpc'); const { resolveOpenclawConfigFile } = require('./frpc');
@@ -83,6 +84,23 @@ function writeJsonFile(filePath, obj) {
fs.writeFileSync(filePath, `${JSON.stringify(obj, null, 2)}\n`, 'utf8'); fs.writeFileSync(filePath, `${JSON.stringify(obj, null, 2)}\n`, 'utf8');
} }
/**
* 终止 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 进程不存在,无需终止');
}
});
}
/** /**
* 同步:从 openclaw.json 删除指定 provider解绑 * 同步:从 openclaw.json 删除指定 provider解绑
* 若 primary 指向该 provider先置为空串。 * 若 primary 指向该 provider先置为空串。
@@ -126,6 +144,7 @@ function removeProviderByName(providerId) {
} }
writeJsonFile(configFile, config); writeJsonFile(configFile, config);
restartGateway();
log.info('openclaw-provider', `provider 已移除: ${providerId}`); log.info('openclaw-provider', `provider 已移除: ${providerId}`);
} }
@@ -252,6 +271,7 @@ function addProviderSync(configFile, providerId, baseUrl, apiKey, models, defaul
ensureWebSearchConfig(configFile, config); ensureWebSearchConfig(configFile, config);
writeJsonFile(configFile, config); writeJsonFile(configFile, config);
restartGateway();
log.info('openclaw-provider', `provider 已写入: ${providerId}${models.length} 个模型)`); log.info('openclaw-provider', `provider 已写入: ${providerId}${models.length} 个模型)`);
} }
@@ -300,6 +320,7 @@ function applyFullProviderFromVps(provider, onDone) {
// provider 无变化,但仍检查 web search 配置 // provider 无变化,但仍检查 web search 配置
if (ensureWebSearchConfig(configFile, existing)) { if (ensureWebSearchConfig(configFile, existing)) {
writeJsonFile(configFile, existing); writeJsonFile(configFile, existing);
restartGateway();
log.info('openclaw-provider', 'web search config applied (provider unchanged)'); log.info('openclaw-provider', 'web search config applied (provider unchanged)');
} else { } else {
log.info('openclaw-provider', `provider 无变化apiKey + 模型列表相同),跳过写盘`); log.info('openclaw-provider', `provider 无变化apiKey + 模型列表相同),跳过写盘`);
@@ -375,6 +396,7 @@ function refreshModelsIfChanged(onDone) {
try { try {
if (ensureWebSearchConfig(configFile, config)) { if (ensureWebSearchConfig(configFile, config)) {
writeJsonFile(configFile, config); writeJsonFile(configFile, config);
restartGateway();
log.info('openclaw-provider', 'web search config applied (no provider)'); log.info('openclaw-provider', 'web search config applied (no provider)');
} }
} catch (_) {} } catch (_) {}
@@ -405,6 +427,7 @@ function refreshModelsIfChanged(onDone) {
const cfg = readJsonFile(configFile); const cfg = readJsonFile(configFile);
if (ensureWebSearchConfig(configFile, cfg)) { if (ensureWebSearchConfig(configFile, cfg)) {
writeJsonFile(configFile, cfg); writeJsonFile(configFile, cfg);
restartGateway();
log.info('openclaw-provider', 'web search config repaired'); log.info('openclaw-provider', 'web search config repaired');
} else { } else {
log.info('openclaw-provider', `模型列表未变化(${newModels.length} 个),跳过更新`); log.info('openclaw-provider', `模型列表未变化(${newModels.length} 个),跳过更新`);

View File

@@ -1,6 +1,6 @@
{ {
"name": "clawd", "name": "clawd",
"version": "1.3.6", "version": "1.3.7",
"description": "Claw Box daemon - connects local Linux box to claw.cutos.ai via WebSocket", "description": "Claw Box daemon - connects local Linux box to claw.cutos.ai via WebSocket",
"main": "lib/client.js", "main": "lib/client.js",
"bin": { "bin": {