Kod
/var/www/html/mediatel/vendor/mediatel/mapping/node_modules/.bin/babel-node /var/www/html/mediatel/vendor/mediatel/mapping/bin/job-daemon.js --redisHost=redis
Potem sprawdzam procesy jakie sa odpalone w systemie i mam dwa procesy na to jedno wywolanie, oto one:
Cytat
root 12171 1.5 0.1 658592 14452 ? Sl+ 15:27 0:00 node /var/www/html/mediatel/vendor/mediatel/mapping/node_modules/.bin/babel-node /var/www/html/mediatel/vendor/mediatel/mapping/bin/job-daemon.js --redisHost=redis
root 12173 74.0 0.9 853912 74632 ? Sl+ 15:27 0:01 node /var/www/html/mediatel/vendor/mediatel/mapping/node_modules/babel-cli/lib/_babel-node /var/www/html/mediatel/vendor/mediatel/mapping/bin/job-daemon.js --redisHost=redis
root 12173 74.0 0.9 853912 74632 ? Sl+ 15:27 0:01 node /var/www/html/mediatel/vendor/mediatel/mapping/node_modules/babel-cli/lib/_babel-node /var/www/html/mediatel/vendor/mediatel/mapping/bin/job-daemon.js --redisHost=redis
Jak widzicie jeden to
/.bin/babel-node
a drugi to
babel-cli/lib/_babel-node
Skad sie bierze ten drugi?
O to tresc skryptu:
Kod
"use strict";
import pg from "pg";
import reacher from "reacher";
import redis from "redis";
import winston from "winston";
import yargs from "yargs";
import layerDeleter from "../js/daemon/layer_deleter";
import statePersister from "../js/state_persister";
const waitForJobSeconds = 10;
const logger = new winston.Logger({
level: yargs.argv.logLevel || "info",
transports: [
new (winston.transports.Console)({timestamp: true})
]
});
let stop = false;
process.on("SIGTERM", () => {
logger.debug(
`Caught SIGTERM. Shutting-down in up to ${waitForJobSeconds} seconds....`
);
stop = true;
});
pg.connect(
"postgres://mediatel:m4ppIn%40@postgis.mediatel.co.uk/regional",
(err, dbConn, done) => {
if (err) {
logger.error(err);
done();
return;
}
const shutdown = function shutdown() {
done();
logger.info("All done.");
};
//noinspection Eslint
const commandBus = reacher.Reacher();
const persister = statePersister.new(layerDeleter.new(dbConn, logger));
const messageBus = redis.createClient({
host: yargs.argv.redisHost || "127.0.0.1"
});
// Register command handlers
commandBus.handle(
"PersistState",
function handlePersistStateCommand(args) {
logger.debug(`Persisting state for map ${args.mapId}.`);
persister.persistState(args.mapId, args.state);
}
);
messageBus.on("error", (er) => logger.error(er));
const waitForJob = function waitForJob() {
const dispatchJob = function dispatchJob(err, job) {
if (err) {
logger.error(err);
}
if (job) {
let {job: name, data} = JSON.parse(job);
logger.info(`Dispatching job ${name}`);
commandBus.request(name, data);
// Now the job has been processed we can drop it completely.
messageBus.lrem("mapping_job_in_progress", 0, job);
}
if (stop) {
shutdown();
return;
}
waitForJob();
};
messageBus.brpoplpush(
"mapping_jobs",
"mapping_job_in_progress",
waitForJobSeconds,
dispatchJob
);
logger.debug("Waiting for a job....");
};
waitForJob();
}
);
import pg from "pg";
import reacher from "reacher";
import redis from "redis";
import winston from "winston";
import yargs from "yargs";
import layerDeleter from "../js/daemon/layer_deleter";
import statePersister from "../js/state_persister";
const waitForJobSeconds = 10;
const logger = new winston.Logger({
level: yargs.argv.logLevel || "info",
transports: [
new (winston.transports.Console)({timestamp: true})
]
});
let stop = false;
process.on("SIGTERM", () => {
logger.debug(
`Caught SIGTERM. Shutting-down in up to ${waitForJobSeconds} seconds....`
);
stop = true;
});
pg.connect(
"postgres://mediatel:m4ppIn%40@postgis.mediatel.co.uk/regional",
(err, dbConn, done) => {
if (err) {
logger.error(err);
done();
return;
}
const shutdown = function shutdown() {
done();
logger.info("All done.");
};
//noinspection Eslint
const commandBus = reacher.Reacher();
const persister = statePersister.new(layerDeleter.new(dbConn, logger));
const messageBus = redis.createClient({
host: yargs.argv.redisHost || "127.0.0.1"
});
// Register command handlers
commandBus.handle(
"PersistState",
function handlePersistStateCommand(args) {
logger.debug(`Persisting state for map ${args.mapId}.`);
persister.persistState(args.mapId, args.state);
}
);
messageBus.on("error", (er) => logger.error(er));
const waitForJob = function waitForJob() {
const dispatchJob = function dispatchJob(err, job) {
if (err) {
logger.error(err);
}
if (job) {
let {job: name, data} = JSON.parse(job);
logger.info(`Dispatching job ${name}`);
commandBus.request(name, data);
// Now the job has been processed we can drop it completely.
messageBus.lrem("mapping_job_in_progress", 0, job);
}
if (stop) {
shutdown();
return;
}
waitForJob();
};
messageBus.brpoplpush(
"mapping_jobs",
"mapping_job_in_progress",
waitForJobSeconds,
dispatchJob
);
logger.debug("Waiting for a job....");
};
waitForJob();
}
);
Skrypt ten sprawdza czy sa jakies nowe rzeczy w redis i jakby co reaguje na nie. Skrypt ten tez powinien sie wylaczyc gdy otrzyma signal TERM. Niestety tak sie nie dzieje. Znaczy kod
Kod
process.on("SIGTERM", () => {
logger.debug(
`Caught SIGTERM. Shutting-down in up to ${waitForJobSeconds} seconds....`
);
stop = true;
});
logger.debug(
`Caught SIGTERM. Shutting-down in up to ${waitForJobSeconds} seconds....`
);
stop = true;
});
Lapie ten sygnal a nastepnie wykonuje sie funkcja shutdown() i teoretycznie skryp przestaje dzialac, jednak w tle nadal dziala ten drugi skrypt i robi swoje.
Gdy probuje wyslac sygnal TERM do tego drugiego procesu to niby tez otrzymuje sygnal ale jakby sie zawiesza.
Ktos sie spotkal z tym, ze node tworzy dwa procesy na jedno wykonanie i czemu tak sie dzieje?