2013-12-20 64 views
4

如果服務器尚未運行,我想編寫一個grunt任務來啓動進程mongod。我需要運行一個mongod進程,但也需要grunt-watch在稍後的任務流中工作。grunt任務:如果未運行,則啓動mongod

This question解釋瞭如何使用grunt-shell來啓動mongod ...接受的答案是阻塞,即使存在異步版本也會產生新的服務器。

有沒有辦法(例如shell腳本)只有在沒有運行的情況下才啓動mongod,而不阻塞其他的grunt任務流?

感謝

+0

http://stackoverflow.com/a/18275415/1085699 H是一個很好的腳本解決方案。 –

+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 
     } 
    }, 
} 

編輯 - 原始版本低於

好了 - 我認爲這是正常...

創建一個shell腳本,如果它沒有運行,將啓動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 
      } 
     }, 
} 

(如果你使用yeoman,使用<%= yeoman.app %>不起作用,因爲這些路徑是相對於整個項目,所以喲你得到'app'之類的東西,而不是整個腳本的路徑。我相信你可以得到它的工作,我只是不知道如何得到的路徑)

如果你只是執行任務grunt shell:mongo mongod將開始,但我無法使用grunt shell:mongo:kill關閉它。但是,假設您稍後使用阻塞任務(我正在使用watch),那麼在您結束該任務時應自動終止它。

希望這可以幫助別人!

3

我發現你的解決方案真的很有用,但實際上想在重啓grunt服務器時殺死mongod。所以我得到了這個:

#!/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真的很好。而我的咕嚕文件看起來像這樣:

//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相同。