如何从同系统的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
相关产品推荐
相关产品推荐

