12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- import { spawn } from 'child_process';
- const watchdogCode = String.raw `
- const pid = parseInt(process.argv[1], 10)
- process.title = 'node (foreground-child watchdog pid=' + pid + ')'
- if (!isNaN(pid)) {
- let barked = false
- // keepalive
- const interval = setInterval(() => {}, 60000)
- const bark = () => {
- clearInterval(interval)
- if (barked) return
- barked = true
- process.removeListener('SIGHUP', bark)
- setTimeout(() => {
- try {
- process.kill(pid, 'SIGKILL')
- setTimeout(() => process.exit(), 200)
- } catch (_) {}
- }, 500)
- })
- process.on('SIGHUP', bark)
- }
- `;
- export const watchdog = (child) => {
- let dogExited = false;
- const dog = spawn(process.execPath, ['-e', watchdogCode, String(child.pid)], {
- stdio: 'ignore',
- });
- dog.on('exit', () => (dogExited = true));
- child.on('exit', () => {
- if (!dogExited)
- dog.kill('SIGKILL');
- });
- return dog;
- };
|