the-shepherd
Version:
Control a herd of wild processes.
108 lines (94 loc) • 2.7 kB
JavaScript
// Generated by CoffeeScript 1.8.0
(function() {
var $, Fs, HJson, Helpers, Os, Process, Shell, log, pid, port;
$ = require('bling');
Fs = require('fs');
Os = require('os');
Shell = require('shelljs');
HJson = require('hjson');
Process = require('./process');
Helpers = module.exports;
log = $.logger("[helper]");
Helpers.readJson = function(file, p) {
if (p == null) {
p = $.Promise();
}
p.wait(function(err, obj) {
if (err) {
return log("readJson(" + file + ") failed:", err);
}
});
Fs.readFile(file, function(err, data) {
var _err;
if (err) {
return p.reject(err);
}
try {
p.resolve(HJson.parse(String(data)));
} catch (_error) {
_err = _error;
p.reject(_err);
}
return null;
});
return p;
};
Helpers.delay = function(ms) {
var p;
p = $.Promise();
$.delay(ms, p.resolve);
return p;
};
Helpers.portIsOwned = function(pid, port, timeout, verbose) {
var p, poll_port, started;
try {
return p = $.Promise();
} finally {
started = $.now;
(poll_port = function() {
var target_pids;
if ($.now - started > timeout) {
return p.reject("Waiting failed after a timeout of: " + timeout + "ms");
}
target_pids = [];
return Process.clearCache().findOne({
pid: pid
}).then(function(proc) {
if (!proc) {
return p.reject("no such pid: " + pid);
} else {
return Process.tree(proc).then(function(tree) {
Process.walk(tree, function(node) {
return target_pids.push(node.pid);
});
if (verbose) {
log("Waiting for targets:", target_pids);
}
return Process.findOne({
ports: port
}).then((function(owner) {
if (verbose) {
log("Port", port, "currently owned by", owner != null ? owner.pid : void 0);
}
if ((!owner) || (!$.matches(owner.pid, target_pids))) {
return setTimeout(poll_port, 300);
} else {
return p.resolve(owner);
}
}), p.reject);
});
}
});
})();
}
};
if (require.main === module) {
if (process.argv.length < 4) {
return;
}
port = parseInt(process.argv[2], 10);
pid = parseInt(process.argv[3], 10);
Process = require("./process");
Helpers.portIsOwned(pid, port, 3000).then($.log, console.error.bind(console));
}
}).call(this);