![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Moderatorzy Postów: 36 559 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Hejka, mam dziwny problem. Odpalam pewien skrypcik przez babel-node taka oto komenda:
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 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(); } ); 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; }); 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? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Hm, więc dodaj process.exit w
Kod process.on("SIGTERM", () => { logger.debug(`Caught SIGTERM. Shutting-down in up to ${waitForJobSeconds} seconds....`); stop = true; process.exit(); }); Dlatego że: Cytat SIGTERM and SIGINT have default handlers on non-Windows platforms that resets the terminal mode before exiting with code 128 + signal number. If one of these signals has a listener installed, its default behavior will be removed (Node.js will no longer exit). Po prostu nadpisujesz domyślne zachowanie, więc albo zrobisz exit ręcznie, albo użyjesz bardziej ogólnego zdarzenia jakim jest beforeExit: Kod process.on("beforeExit", () => {
logger.debug(`Caught SIGTERM. Shutting-down in up to ${waitForJobSeconds} seconds....`); stop = true; }); Ten post edytował by_ikar 21.10.2016, 11:06:30 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 16.10.2025 - 12:16 |