[object Object]

← back to Ticket System

use owner-safe PM2 CLI wrapper

5ef46940f648002c06169ebee162cb7b4ae85292 · 2026-08-30 20:54:49 -0700 · Steve Abrams

Files touched

Diff

commit 5ef46940f648002c06169ebee162cb7b4ae85292
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sun Aug 30 20:54:49 2026 -0700

    use owner-safe PM2 CLI wrapper
---
 server.js | 29 ++---------------------------
 1 file changed, 2 insertions(+), 27 deletions(-)

diff --git a/server.js b/server.js
index f00b4ff3..4a56b6dd 100644
--- a/server.js
+++ b/server.js
@@ -35,25 +35,7 @@ function pm2DaemonReachable() {
   } catch (_) { return false; }
 }
 let runCache = { ts: 0, data: { pm2: [], sessions: 0, at: null } };
-const PM2_CLI_LOCK_TS = path.join(PM2_HOME_TS, 'cli.lock.d');
-async function acquirePm2CliLock() {
-  const deadline = Date.now() + 10000;
-  const staleMs = 8000;
-  while (Date.now() < deadline) {
-    try {
-      await fs.promises.mkdir(PM2_CLI_LOCK_TS);
-      return async () => { try { await fs.promises.rmdir(PM2_CLI_LOCK_TS); } catch {} };
-    } catch (e) {
-      if (e.code !== 'EEXIST') return null;
-      try {
-        const st = await fs.promises.stat(PM2_CLI_LOCK_TS);
-        if (Date.now() - st.mtimeMs > staleMs) { await fs.promises.rmdir(PM2_CLI_LOCK_TS); continue; }
-      } catch {}
-      await new Promise(resolve => setTimeout(resolve, 80));
-    }
-  }
-  return null;
-}
+const PM2_SERIALIZED_TS = path.join(os.homedir(), '.claude', 'skills', 'keep-alive', 'proposals', 'TK-10970', 'pm2-serialized.js');
 function getRunning(cb) {
   if (Date.now() - runCache.ts < 5000) return cb(runCache.data);
   if (!pm2DaemonReachable()) {
@@ -61,13 +43,7 @@ function getRunning(cb) {
     runCache = { ts: Date.now(), data: { pm2: runCache.data.pm2 || [], sessions: runCache.data.sessions || 0, at: new Date().toISOString() } };
     return cb(runCache.data);
   }
-  acquirePm2CliLock().then((release) => {
-    if (!release) {
-      runCache = { ts: Date.now(), data: { pm2: runCache.data.pm2 || [], sessions: runCache.data.sessions || 0, at: new Date().toISOString() } };
-      return cb(runCache.data);
-    }
-    exec('pm2 jlist', { maxBuffer: 16 * 1024 * 1024, timeout: 7000, killSignal: 'SIGKILL' }, async (e, out) => {
-      await release();
+  execFile(process.execPath, [PM2_SERIALIZED_TS, 'jlist'], { maxBuffer: 16 * 1024 * 1024, timeout: 22000, killSignal: 'SIGKILL' }, (e, out) => {
       let pm2 = [];
       if (!e) { try {
         pm2 = JSON.parse(out).filter(p => p.pm2_env && p.pm2_env.status === 'online')
@@ -82,7 +58,6 @@ function getRunning(cb) {
         runCache = { ts: Date.now(), data: { pm2, sessions, at: new Date().toISOString() } };
         cb(runCache.data);
       });
-    });
   });
 }
 

← b7a70b2b serialize ticket-board PM2 fleet reads  ·  back to Ticket System  ·  Sync YOLO cycles into the ticket ledger 7ebd636e →