node.js的进程保活

nodejs的进程保活其实用PM2应该更好用些,不过由于原理其实并不复杂,我们可以自己手写一个服务来干这个工作。

假设我们有一个服务,可以这样来定义下它的相关信息:

javascript 复制代码
const svcs=[
{"sid":"apl","name":"application.js"},
...
]

我们是这样启动这个服务的:

bash 复制代码
node application.js

服务启动时将进程id保存到这个pid文件中

javascript 复制代码
const { pid } = require('node:process');
...
fs.writeFileSync("pid/s"+sid+".pid"," "+pid);

这样,我们可以根据svcs的定义定时检查pids目录下的这些文件,看它们的进程还在不?不在的话,执行启动服务命令拉起服务。

javascript 复制代码
//keepalive.js
const fs=require("fs");
const { spawn } = require('child_process');
const gitBashPath = 'C:\\Program Files\\Git\\bin\\bash.exe';
const svcPath='/c/nodeproj/'

function pidIsRunning(svcpid) {
	try {
		process.kill(svcpid, 0); return true;
	} catch (e) { return false; }
}

const svcs=[
	{ "id":"apl","name":"application.js" }
	];

svcs.forEach(svc=>{
	let svcpid = fs.readFileSync("pid/"+svc["id"]+".pid","utf8").substr(1);
	console.log(svc);
	console.log(svcpid);
	let svcalive=pidIsRunning(svcpid);
	console.log(svcalive);

	if (!svcalive) {
		const child = spawn(gitBashPath, ['-c', 'node '+svcPath+svc["name"]+' &'],{ detached: true, stdio: 'ignore' });
		child.unref();
		}
	});
process.exit(0);

注意spawn带上{ detached: true, stdio: 'ignore' }参数,是为了确保主进程退出,后台服务仍然保持运行。

上面这个例程是一个一次性运行的脚本,可以简单的改造成定时任务,就从略了。

相关推荐
SmartBrain12 分钟前
Spring Boot的高性能技术栈的工程实践
spring boot·后端·架构
AMoon丶31 分钟前
Golang--内存管理
开发语言·后端·算法·缓存·golang·os
zabr44 分钟前
花了 100+ 篇笔记,我整理出 了一套 AI Agent 工程完全指南
前端·后端·agent
神奇小汤圆1 小时前
Java面试题及答案整理(2026年金三银四最新版,持续更新)
后端
uzong1 小时前
“腾讯QClaw全面开放”,不花 Token 钱、真正体验一把小龙虾的快乐,最低成本全面了解龙虾
人工智能·后端
楼田莉子1 小时前
C++高并发内存池:内存池调优与测试
c++·后端·哈希算法·visual studio
短剑重铸之日1 小时前
《ShardingSphere解读》16 改写引擎:如何理解装饰器模式下的 SQL 改写实现机制?
java·数据库·后端·sql·shardingsphere·分库分表·装饰器模式
q5431470871 小时前
VScode 开发 Springboot 程序
java·spring boot·后端
学习要积极1 小时前
Springboot图片验证码-EasyCaptcha
java·spring boot·后端
Nyarlathotep01132 小时前
可重入锁ReentrantLock基础和原理
后端