Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> babel-node tworzy dwa procesy
nospor
post
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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
by_ikar
post
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
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 16.10.2025 - 12:16