Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> babel-node tworzy dwa procesy
nospor
post 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

Go to the top of the page
+Quote Post
by_ikar
post 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.
Go to the top of the page
+Quote Post
nospor
post 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 wink.gif

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 sad.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
by_ikar
post 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
Go to the top of the page
+Quote Post
nospor
post 24.10.2016, 15:09:09
Post #5





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6296
Dołączył: 27.12.2004




Dzieki smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 07:52