You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.5 KiB
JavaScript
56 lines
1.5 KiB
JavaScript
const os = require("os");
|
|
const childProcess = require("child_process");
|
|
const psTree = require("ps-tree");
|
|
const streamToLogger = require("stream-to-logger");
|
|
|
|
module.exports = function runProcess(path, args, options) {
|
|
if (options.logger != null) {
|
|
options.logger.info(`Starting ${path}...`);
|
|
}
|
|
|
|
let proc = childProcess.spawn(path, args, options);
|
|
|
|
if (options.logger != null) {
|
|
proc.stdout.pipe(streamToLogger(options.logger.log));
|
|
proc.stderr.pipe(streamToLogger(options.logger.error));
|
|
}
|
|
|
|
proc.on("error", (err) => {
|
|
if (options.logger != null) {
|
|
options.logger.error(err.stack);
|
|
}
|
|
});
|
|
|
|
proc.on("close", (code, signal) => {
|
|
if (code != null) {
|
|
options.logger.info(`${path} exited with code ${code.toString()}.`);
|
|
} else if (signal != null) {
|
|
options.logger.info(`${path} exited due to signal ${signal}.`);
|
|
} else {
|
|
options.logger.info(`${path} exited for an unknown reason.`);
|
|
}
|
|
});
|
|
|
|
let _kill = proc.kill.bind(proc);
|
|
proc.kill = function(signal) {
|
|
/* FIXME: Are other UNIX-y platforms also affected by the killing-children-of-children issue? And do they have `ps` with the same flags? */
|
|
if (os.platform() === "linux") {
|
|
psTree(proc.pid, (err, children) => {
|
|
if (err != null) {
|
|
console.error(`WARN: Could not kill children of PID ${proc.pid}: ${err.message}`);
|
|
console.error(err.stack);
|
|
_kill(signal);
|
|
} else {
|
|
childProcess.execFile("kill", children.map((child) => child.PID), (err, stdout, stderr) => {
|
|
_kill(signal);
|
|
});
|
|
}
|
|
})
|
|
} else {
|
|
_kill(signal);
|
|
}
|
|
}
|
|
|
|
return proc;
|
|
}
|