2013-12-20 2 views
4

Я хочу написать задачу grunt, чтобы запустить процесс mongod, если сервер еще не запущен. Мне нужен процесс mongod, но вам также нужно, чтобы часы-возились, чтобы работать позже в потоке задач.grunt task: start mongod if not running

This question объясняет, как запустить mongod с помощью grunt-shell ... принятый ответ блокируется, а асинхронная версия порождает новый сервер, даже если он существует.

Есть ли способ (например, сценарий оболочки), чтобы запустить mongod только в том случае, если он не работает, не блокируя остальную часть потока задач grunt?

Благодаря

+0

http://stackoverflow.com/a/18275415/1085699 В качестве хорошего решения для скрипта. –

+0

Я не очень свободно владею оболочкой - могу ли я просто положить все это на одну строку, и она запустится? –

+0

Нет, вам нужно будет сделать это сценарий, а затем называть его от ворчания. Это может помочь: http://stackoverflow.com/questions/18368575/execute-shell-script-in-gruntfile-and-assign-result-to-variable –

ответ

6

Вот уборщик версия

магазин это как startMongoIfNotRunning.sh в том же месте, как Gruntfile:

# this script checks if the mongod is running, starts it if not 

if pgrep -q mongod; then 
    echo running; 
else 
    mongod; 
fi 

exit 0; 

И в вашем Gruntfile:

shell: { 
    mongo: { 
     command: "sh startMongoIfNotRunning.sh", 
     options: { 
      async: true 
     } 
    }, 
} 

Edit - оригинальная версия ниже

Ok - Я думаю, что это работает правильно ...

создать скрипт, который начнет mongod, если он не работает ... сохранить его где-то, вероятно, в вашем проекте. Я назвал его startMongoIfNotRunning.sh:

# this script checks if the mongod is running, starts it if not 

`ps -A | grep -q '[m]ongod'` 

if [ "$?" -eq "0" ]; then 
    echo "running" 
else 
    mongod 
fi 

Вы, возможно, придется сделать его исполняемым: chmod +x path/to/script/startMongoIfNotRunning.sh

Установка черновую-оболочки отродье: npm install grunt-shell-spawn --save-dev

Затем в Gruntfile добавить это:

shell: { 
     mongo: { 
      command: "exec path/to/script/startMongoIfNotRunning.sh", 
      options: { 
       async: true 
      } 
     }, 
} 

(Если вы используете yoman, использование <%= yeoman.app %> не работает, потому что эти пути относятся ко всему проекту, поэтому yo u получите что-то вроде «app», а не весь путь к скрипту. Я уверен, что вы можете заставить его работать, я просто не знаю, как получить путь)

Если вы только что выполнили задачу grunt shell:mongo mongod запустится, но я не смог ее закрыть, используя grunt shell:mongo:kill. Однако, предполагая, что вы используете блокирующую задачу позже (я использую watch), тогда она должна автоматически быть убита, когда вы закончите эту задачу.

Надеюсь, это поможет кому-то!

3

Я нашел ваше решение действительно полезным, но на самом деле хотел убить mongod при перезапуске сервера grunt. Так что я получил это:

#!/bin/sh 

# this script checks if the mongod is running, kills it and starts it 

MNG_ID="`ps -ef | awk '/[m]ongod/{print $2}'`" 

if [ -n "$MNG_ID" ]; then 
    kill $MNG_ID 
fi 

mongod 

, который действительно работает на моем mac. И мой файл grunt выглядит так:

//used to load mongod via shell 
    shell: { 
     mongo: { 
      command: './mongo.sh', 
      options: { 
       async: true 
      } 
     } 
    } 

Итак, мой mongo.sh находится в том же месте, что и мой Grunfile.js

Cheers

+1

вам придется переместить 'mongod' из оператора if , нет? –

+0

@MaxBates: Вы правы, или вы правы! Просто отредактировал :) – x057

0

Остальные два ответа верны. Однако для полноты здесь есть эквивалентный пакетный скрипт в Windows. Сохранить следующий как startMongoIfNotRunning.bat:

tasklist /fi "imagename eq mongod.exe" |find "=" > nul 
if errorlevel 1 mongod 

Если есть задача, которая выполняется под названием mongod.exe то = символ должен появиться на выходе - следовательно, если он не работает, то = символ не будет найден и переменная ErrorLevel будет установлен в 1.

Остальное - это то же, что и ответ @MaxBates.