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