В настоящее время, я делаю код, чтобы сторожить мои файлы определенного каталога и видеть, когда происходят изменения, для таким образом, возобновлять сервер, сервер - express, и прокручивает изображение в окне с другого файла, сервер суб-процессом, это мой код:
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;
});
Функционируй почти хорошо, а именно, он едва работает, инициализирует сервер успешно, но обнаружив изменение, убивает процесс сервера, но вновь не инициализирует это.
Вопрос главным образом: Как возобновлять соответствующим образом процесс с nodejs?
#!/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;
});
Видя твой код я вижу, что ты посылаешь один
child_server.kill()
Пошли сигнал в порожденный процесс. Если не встретятся аргументы, он пошлет 'SIGTERM'
.
Имей в виду, что, хотя ты призываешь в функцию kill, сигнал, посланный в порожденный процесс в действительности не может заканчивать это. В самом деле, kill
только пошли сигнал в процесс.
Попытайся с:
child_server.disconnect()
проверь PID безопасного сына ты это не убиваешь добра и он не создает тебя, когда ты возобновляешь.
on('exit')....
объект внутри того же объекта вызывал некую ошибку у instanciar. – 31.12.2016, 04:44start()
и продолжи функционировать, но там они не показывают данныхchild_server
. – 31.12.2016, 04:59