node.js的进程保活
nodejs的进程保活其实用PM2应该更好用些,不过由于原理其实并不复杂,我们可以自己手写一个服务来干这个工作。
假设我们有一个服务,可以这样来定义下它的相关信息:
const svcs=[
{"sid":"apl","name":"application.js"},
...
]
我们是这样启动这个服务的:
node application.js
服务启动时将进程id保存到这个pid文件中
const { pid } = require('node:process');
...
fs.writeFileSync("pid/s"+sid+".pid"," "+pid);
这样,我们可以根据svcs的定义定时检查pids目录下的这些文件,看它们的进程还在不?不在的话,执行启动服务命令拉起服务。
//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’ }参数,是为了确保主进程退出,后台服务仍然保持运行。
上面这个例程是一个一次性运行的脚本,可以简单的改造成定时任务,就从略了。
原文地址:https://blog.csdn.net/dgiij/article/details/145135197
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!