Как возобновлять процесс с NodeJS?

В настоящее время, я делаю код, чтобы сторожить мои файлы определенного каталога и видеть, когда происходят изменения, для таким образом, возобновлять сервер, сервер - , и прокручивает изображение в окне с другого файла, сервер суб-процессом, это мой код:

watcher.js

#!/usr/bin/env node
'use strict';

var fs = require('fs');
var spawn = require('child_process').spawn;

const BASE_DIR = __dirname;
const ENCODING = 'utf8';

var child_server = spawn('node', [`${BASE_DIR}/main.js`], { stdio: [null, null, null, 'ipc'] });


child_server.stdout.on('data', (data) => {
    console.log(data.toString(ENCODING));
});

child_server.stderr.on('data', (data) => {
    console.log('Traceback:\n');
    console.log(data.toString(ENCODING));
});

child_server.on('exit', () => {
    // aqui es donde trato volver a iniciar el proceso, pero no inicia
    setTimeout(() => {
        // console.log(child_server);
        child_server = spawn('node', [`${BASE_DIR}/main.js`], {stdio: [null, null, null, 'ipc']});
    }, 2000);
    console.log('Restaring the server...');
});

fs.watch(BASE_DIR, {encoding: 'buffer', recursive: true}, (eventType, filename) => {
    if (eventType == 'change' && filename) {
        // child_server.kill('SIGHUP');
        child_server.kill('SIGINT');
    }
});

process.on('SIGINT', function() {
    console.log("Caught interrupt signal");

    child_server.kill();
    process.exit();
});

process.on('uncaughtException', function(error) {
    child_server.kill();
    throw error;
});

Функционируй почти хорошо, а именно, он едва работает, инициализирует сервер успешно, но обнаружив изменение, убивает процесс сервера, но вновь не инициализирует это.

Вопрос главным образом: Как возобновлять соответствующим образом процесс с ?

0
задан 09.04.2019, 00:17
0 ответов
#!/usr/bin/env node
'use strict';

var fs = require('fs');
var spawn = require('child_process').spawn;

const BASE_DIR = __dirname;
const ENCODING = 'utf8';

var child_server;

start();

function start(){
    child_server = spawn('node', [`${BASE_DIR}/main.js`], {stdio: [null, null, null, 'ipc']});
    child_server.stdout.on('data', (data)=>{out(data)});
    child_server.stderr.on('data', (data)=>{err(data)});
}

function out(data){
    console.log(data.toString(ENCODING));
}

function err(data){
    console.log('Traceback:\n');
    console.log(data.toString(ENCODING));
}

fs.watch(BASE_DIR, {encoding: 'buffer', recursive: true}, (eventType, filename) => {
    if (eventType == 'change' && filename) {
        // child_server.kill('SIGHUP');
        child_server.kill('SIGINT');
        console.log("Reiniciando...");
        //Aqui lo reinicia.
        start();
    }
});

process.on('SIGINT', function() {
    console.log("Caught interrupt signal");

    child_server.kill();
    process.exit();
});

process.on('uncaughtException', function(error) {
    child_server.kill();
    throw error;
});
1
ответ дан 03.12.2019, 17:55
  • 1
    Не, который ты сделал отличного от части делания funció n для start, но меня funcionó добро, большое спасибо, мне понравилось бы многий, который ты объяснишь, что ты сделал, чтобы вновь не совершать ошибку, после этого я помечаю тебя ответ –   31.12.2016, 04:38
  • 2
    Я думаю, что в on('exit').... объект внутри того же объекта вызывал некую ошибку у instanciar. –   31.12.2016, 04:44
  • 3
    Уже я только что понял ошибку, проблема, - что, создав снова процесс, не añ adia события, которые показывали данные в консоли, помещенный события в функции, если они añ adidos, большое спасибо из-за твоей помощи друг –   31.12.2016, 04:47
  • 4
    Я это протестировал, не определяя событий в start() и продолжи функционировать, но там они не показывают данных child_server. –   31.12.2016, 04:59
  • 5
    или же, что có я говорю, он был хорошо, но не делал log? –   31.12.2016, 05:01

Видя твой код я вижу, что ты посылаешь один

child_server.kill()

Пошли сигнал в порожденный процесс. Если не встретятся аргументы, он пошлет 'SIGTERM'.

Имей в виду, что, хотя ты призываешь в функцию kill, сигнал, посланный в порожденный процесс в действительности не может заканчивать это. В самом деле, kill только пошли сигнал в процесс.

Попытайся с:

child_server.disconnect()

проверь PID безопасного сына ты это не убиваешь добра и он не создает тебя, когда ты возобновляешь.

0
ответ дан 03.12.2019, 17:55
  • 1
    Уже solucioné большое спасибо из-за твоего ответа, однако тот, кто заканчивал процесс, был está линия 'child_server.kill (' SIGINT');' и señ в es SIGINT –   31.12.2016, 04:49