babel-node tworzy dwa procesy |
babel-node tworzy dwa procesy |
19.10.2016, 16:33:27
Post
#1
|
|
Grupa: Moderatorzy Postów: 36 457 Pomógł: 6296 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? -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
19.10.2016, 18:14:35
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) |
Dlatego: https://github.com/babel/babel/blob/master/...bel-node.js#L83
po prostu babel spawnuje kolejny proces w którym odpala twoje pliki już "przekompilowane" do ES5. Wyjście? Przerobić importy na require i użyć normalnie node w wersji 4+, lub od razu przekompilować do ES5 i odpalać w takiej postaci normalnie noda. |
|
|
20.10.2016, 15:33:50
Post
#3
|
|
Grupa: Moderatorzy Postów: 36 457 Pomógł: 6296 Dołączył: 27.12.2004 |
@by_ikar dzieki, jutro do tego siade i sprawdze czy cos mi sie uda wskorac. Ja i node pijamy w innych barach no ale moze uda nam sie dojsc do porozumienia
edit: miales racje, skompilowanie tego a potem poprostu odpalenie z node nie tworzy tego drugiego procesu. Problem z niewychodzenia z appki nadal jednak wystepuje. Wysylam do procesu sygnal TERM, proces go lapie, odpala funkcje shutdown, wyswietla komunikat ALL DONE ale i tak nie konczy dzialania i wisi sobie w procesach. Jedyna roznica jest taka ze juz jak drugi raz wysylam sygnal TERM to juz go nie lapie i nic nie wyswietla wiec pewnie wisi gdzies juz na innej czesci skryptu -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
21.10.2016, 11:06:05
Post
#4
|
|
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 |
|
|
24.10.2016, 15:09:09
Post
#5
|
|
Grupa: Moderatorzy Postów: 36 457 Pomógł: 6296 Dołączył: 27.12.2004 |
Dzieki
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
Wersja Lo-Fi | Aktualny czas: 27.04.2024 - 07:52 |