利用python寫mongodb的啓動腳本

 利用python寫mongodb的啓動腳本,包含關閉,啓動,重啓功能。
注意事項:
       1 此代碼使用python3, 啓動方式 python mong.py  start | stop | restart  
       2 其中幾個全局變量,mongodb的主目錄結構是否與之一致。其中mongo的安裝要有bin目錄,以及conf的文件內容後面也有。
       3 這裏的關閉時直接使用的kill ,這樣會強制殺死,如果是集羣版本,則關閉的方式不能強制。需要使用另外一種比較緩和的方式退出(使用管理員方式退出),否則可能會導致數據同步不完整。
       4 難點在於能否將linux命令查詢後的結果複製給python變量,使用os均失敗,結果會打印,但是不會賦值給變量。重啓以及關閉的邏輯的完整性是否合理。(詳情看代碼註釋)
       5 文件名不能帶有mongod。
       6 寫啓動文件的位置參數、行爲參數的時候,還是使用 argparse模塊合適。此處的signal也是可以。

#!/usr/local/bin/python3
import os
import subprocess
import sys
import time
import signal

# mongodb安裝目錄
MONGO_HOME = "/usr/local/mongodb"

# bin目錄(先新建目錄,然後將幾個mongo的命令cp或者mv)
MONGO_BIN = os.path.join(MONGO_HOME, "bin")
# MONGO_CONF = os.path.join(MONGO_HOME, "conf")

# 兩個主要的啓動參數
MONGO_BIN_MONGOD = os.path.join(MONGO_BIN, "mongod")
MONGO_CONF_MONGOD = os.path.join(MONGO_HOME, "mongodb.conf")


class MongdbStart(object):


    def __QueryMongo(self):
        cmd = "ps -ef | grep mongod | grep -v grep |wc -l"
        return subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)


    def __QueryMongoPid(self):
        # 返回查詢的MongoDB的pid的對象
        cmd = "ps -ef | grep mongod |grep -v grep | awk '{print $2}'"
        return subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)


    def GetPid(self):
        # 返回pid結果
        return self.__QueryMongoPid().stdout.readline().decode('utf-8', errors='ingore')


    def __StartMongo(self):
        # 啓動MongoDB
        cmd = [MONGO_BIN_MONGOD, '-f', MONGO_CONF_MONGOD]
        print("Mongodb Starting ....")
        return subprocess.Popen(cmd)


    def StopMongo(self):
        # 停止MongoDB
        print("Stop Mongdb......")
        time.sleep(2)
        pid = self.GetPid()
        if pid:
            # 假如有pid則強制殺死
            os.kill(int(pid), signal.SIGKILL) 
            print("mongod is stopped")
        else:
            print("mongo is not running")


    def OnlyStart(self):
        # 啓動MongoDB
        result = self.GetPid()
        print("mongodb is starting")
        if result:
            print("程序已在運行, pid爲:", result)
        else:
            self.__StartMongo()
            print('mongodb pid :', self.GetPid())


    def Restart(self):
        # 重啓MongoDB
        self.StopMongo()
        result = self.GetPid()
        if result:
            return "程序未退出,請重新停止"
        time.sleep(3)
        print(result, 11111)
        self.__StartMongo()
        result = self.GetPid()
        if result:
            print("程序的pid爲:", result)


    def ActionJudge(self):
        # 啓動參數選擇
        CHOICE = ['start', 'restart', 'stop']
        while 1:
            action = sys.argv[1]
            if action in CHOICE:
                return action
            else:
                print("您輸入有誤,請重新輸入,可選:{}".format(CHOICE))


if __name__ == '__main__':
    mongo = MongdbStart()
    action = mongo.ActionJudge()
    if action == 'start':
        mongo.OnlyStart()
    elif action == 'restart':
        mongo.Restart()
    elif action == 'stop':
        mongo.StopMongo()

mongodb.confg 文件配置
 

# MongoDB的啓動配置。
port=27017
bind_ip=0.0.0.0  # 這樣可以外網訪問,前提是放開上面的端口
journal=false
fork=true
auth=true
# 下面的三個路徑必須要有,可以自定義。
dbpath=/usr/local/mongodb/data/db 
logpath=/usr/local/mongodb/logs/mongodb.log
pidfilepath=/usr/local/mongodb/logs/mongodb.pid

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章