Bootstrap

利用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

 

;