#!/usr/bin/env node 'use strict'; const fs = require('fs'), path = require('path'); const { Supervisor } = require('../runtime/supervisor'); const root = path.resolve(__dirname, '..'); const lock = path.resolve(process.env.SCRAPER_DATA || path.join(process.env.DATA || path.join(root, 'data'), 'scraper'), 'supervisor.lock'); fs.mkdirSync(path.dirname(lock), { recursive: true }); if (fs.existsSync(lock)) { const pid = Number(fs.readFileSync(lock, 'utf8')); try { process.kill(pid, 0); throw new Error(`Supervisor already alive (PID ${pid})`); } catch (e) { if (e.code !== 'ESRCH') throw e; fs.unlinkSync(lock); } } fs.writeFileSync(lock, String(process.pid), { flag: 'wx' }); const supervisors = ['reader', 'scraper'].map(name => new Supervisor(name, { root })); supervisors.forEach(service => service.start()); const keepalive = setInterval(() => {}, 60000); let closing = false; for (const signal of ['SIGINT', 'SIGTERM']) process.on(signal, async () => { if (closing) return; closing = true; clearInterval(keepalive); await Promise.all(supervisors.map(service => service.close())); fs.unlinkSync(lock); process.exit(0); });