注冊微信號的網(wǎng)站網(wǎng)站設(shè)計(jì)模板網(wǎng)站
nodejs的進(jìn)程保活其實(shí)用PM2應(yīng)該更好用些,不過由于原理其實(shí)并不復(fù)雜,我們可以自己手寫一個服務(wù)來干這個工作。
假設(shè)我們有一個服務(wù),可以這樣來定義下它的相關(guān)信息:
const svcs=[
{"sid":"apl","name":"application.js"},
...
]
我們是這樣啟動這個服務(wù)的:
node application.js
服務(wù)啟動時將進(jìn)程id保存到這個pid文件中
const { pid } = require('node:process');
...
fs.writeFileSync("pid/s"+sid+".pid"," "+pid);
這樣,我們可以根據(jù)svcs的定義定時檢查pids目錄下的這些文件,看它們的進(jìn)程還在不?不在的話,執(zhí)行啟動服務(wù)命令拉起服務(wù)。
//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’ }參數(shù),是為了確保主進(jìn)程退出,后臺服務(wù)仍然保持運(yùn)行。
上面這個例程是一個一次性運(yùn)行的腳本,可以簡單的改造成定時任務(wù),就從略了。