Process manager — monitor and restart crashed processes.
1const { fork } = require("child_process");23class ProcessManager {4 constructor() {5 this.processes = new Map();6 }78 start(name, script, options = {}) {9 const { maxRestarts = 5, restartDelay = 1000 } = options;10 let restarts = 0;1112 const spawn = () => {13 const child = fork(script);1415 child.on("exit", (code) => {16 console.log(`${name} exited with code ${code}`);17 this.processes.delete(name);1819 if (restarts < maxRestarts && code !== 0) {20 restarts++;21 console.log(`Restarting ${name} (${restarts}/${maxRestarts})...`);22 setTimeout(spawn, restartDelay);23 }24 });2526 child.on("error", (err) => {27 console.error(`${name} error:`, err);28 });2930 this.processes.set(name, {31 child,32 restarts,33 startedAt: Date.now(),34 });35 };3637 spawn();38 }3940 stop(name) {41 const proc = this.processes.get(name);42 if (proc) {43 proc.child.kill();44 this.processes.delete(name);45 }46 }4748 status() {49 const status = {};50 this.processes.forEach((proc, name) => {51 status[name] = {52 pid: proc.child.pid,53 restarts: proc.restarts,54 uptime: Date.now() - proc.startedAt,55 };56 });57 return status;58 }59}6061// Usage62const pm = new ProcessManager();63pm.start("api", "./server.js", { maxRestarts: 3 });64pm.start("worker", "./worker.js");65console.log(pm.status());