You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从同系统的Node.js维护服务器启停另一台主服务器

同系统Node服务跨进程启停控制方案

完全可以实现,两个服务运行在同一操作系统下,维护服务可通过调用系统进程接口完成主服务的启停控制,以下是具体实现方案:

前置准备

提前固化两个服务的启动脚本,在主服务的package.json中明确启动命令,示例:

{
  "scripts": {
    "start:main": "node index.js"
  }
}

生产环境推荐用PM2做进程管理器,避免PID漂移、进程意外退出等问题,稳定性更高。

实现方案

方案1:原生Node.js实现(无额外依赖)

核心原理是通过child_process模块调用系统命令,匹配主服务PID后执行启停操作:

  • 主服务启动时写入PID到本地文件,方便维护服务识别进程:
const fs = require('fs');
// 启动时写入PID
fs.writeFileSync('./main.pid', process.pid.toString());
// 进程退出时自动删除PID文件
process.on('exit', () => {
  if(fs.existsSync('./main.pid')) fs.unlinkSync('./main.pid')
});
  • 维护服务停止主服务代码:
const { exec } = require('child_process');
const fs = require('fs');

function stopMainServer() {
  if(!fs.existsSync('./main.pid')) return console.log('主服务未运行');
  const mainPid = fs.readFileSync('./main.pid', 'utf-8').trim();
  exec(`kill ${mainPid}`, (err) => {
    err ? console.error('停止主服务失败:', err) : console.log('主服务已停止');
  });
}
  • 维护服务启动主服务代码:
function startMainServer() {
  // 替换为你主服务的实际项目目录
  const mainServerPath = '/www/main-server';
  exec('npm run start:main', {
    cwd: mainServerPath,
    detached: true, // 主服务进程脱离维护服务进程树,避免维护服务重启连带关闭主服务
    stdio: 'ignore'
  }, (err) => {
    err ? console.error('启动主服务失败:', err) : console.log('主服务已启动');
  }).unref();
}

方案2:PM2进程管理实现(生产环境推荐)

提前用PM2注册两个服务并设置固定标识:

  • 进入主服务目录执行:pm2 start npm --name main-server -- run start:main
  • 进入维护服务目录执行:pm2 start npm --name maintenance-server -- run start

维护服务直接调用PM2命令即可控制主服务:

const { exec } = require('child_process');

// 停止主服务
function stopMainServer() {
  exec('pm2 stop main-server', (err) => err && console.error('停止失败:', err));
}

// 启动主服务
function startMainServer() {
  exec('pm2 start main-server', (err) => err && console.error('启动失败:', err));
}

// 重启主服务
function restartMainServer() {
  exec('pm2 restart main-server', (err) => err && console.error('重启失败:', err));
}

注意事项

  • 权限校验:确保维护服务运行的系统用户拥有主服务目录的读写权限、启停命令的执行权限,不推荐用root用户运行业务服务降低安全风险
  • 状态校验:每次操作前后可通过PID、PM2状态命令校验主服务运行状态,避免重复启停的异常
  • 异常捕获:所有进程调用操作都要添加错误捕获逻辑,避免异常抛出导致维护服务崩溃

内容的提问来源于stack exchange,提问作者Harald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:39:04