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