Использование Gulp для управления открытием и закрытием MongoDB

Пока у меня есть дочерний_процесс, который выполняет «mongod --dbpath db» и другой дочерний_процесс, который может убить его с помощью «mongod --dbpath db --shutdown». Как мне прослушать, чтобы пользователь ввел ctrl-c или вышел из gulp runner, а затем запустить задачу gulp для выключения монго?


person jonwho    schedule 23.02.2015    source источник


Ответы (3)


Я пробовал нечто подобное и наткнулся на этот ответ. Я немного переработал его, чтобы он стал просто командной функцией запуска. Функционально не должно быть никакой разницы между --shutdown и командой, которую я использую.

var gulp = require('gulp');
var exec = require('child_process').exec;

function runCommand(command) {
  return function (cb) {
    exec(command, function (err, stdout, stderr) {
      console.log(stdout);
      console.log(stderr);
      cb(err);
    });
  }
}

//Running mongo
//https://stackoverflow.com/a/28048696/46810
gulp.task('start-mongo', runCommand('mongod --dbpath ./data/'));
gulp.task('stop-mongo', runCommand('mongo --eval "use admin; db.shutdownServer();"'));
gulp.task('start-app', runCommand('node app.js'));
person QueueHammer    schedule 07.03.2015

Ответ @QueueHammer был очень полезным, но чтобы запустить его для моих данных (OSX, MongoDB 3.0.1), потребовалось следующее:

var exec = require('child_process').exec;
var mkdirs = require('mkdirs');

var runCommand = function(command) {
  exec(command, function (err, stdout, stderr) {
    console.log(stdout);
    console.log(stderr);
    if (err !== null) {
      console.log('exec error: ' + err);
    }
  });
}

gulp.task("mongo-start", function() {
  var command = "mongod --fork --dbpath "+paths.dbDir+"/ --logpath "+paths.dbLogs+"/mongo.log";
  mkdirs(paths.dbDir);
  mkdirs(paths.dbLogs);
  runCommand(command);
});

gulp.task("mongo-stop", function() {
  var command = 'mongo admin --eval "db.shutdownServer();"'
  runCommand(command);
});
person Steve    schedule 08.04.2015

В дополнение к приведенным выше ответам, если вам нужно независимое от платформы решение, которое работает в любой ОС/среде. Вы можете использовать докер.

Таким образом, ваша задача gulp будет выглядеть примерно так:

const Gulp = require('gulp');
const exec = require('child_process').exec;

function runCommand(command) {
  return function (cb) {
    exec(command, function (err, stdout, stderr) {
      console.log(stdout);
      console.log(stderr);
      cb(err);
    });
  };
}


// Database tasks
Gulp.task('start-mongo', runCommand('docker run --rm --name mongo-dev -p 27017:27017 mongo'));
Gulp.task('start-mongo-viewer', runCommand('docker run --rm --name mongo-express-dev --link mongo-dev:mongo -p 8081:8081 mongo-express'));
person olive_tree    schedule 19.10.2016