python—memcached啟動腳本
阿新 • • 發佈:2017-12-07
python一、一般模式
啟動選項:start、stop、restart、status
#!/usr/bin/env python #encoding:utf-8 import sys import os from subprocess import Popen, PIPE class Process(object): '''memcached rc script''' def __init__(self,name,program,argv,workdir): # 初始化類,包含:self、程序名、程序啟動文件、執行參數、pid文件路徑 self.name = name self.program = program self.argv = argv self.workdir = workdir def __workDir(self): # 判斷pid文件路徑,沒有則創建 '''/var/tmp/memcached''' if not os.path.exists("/var/tmp/memcached"): os.mkdir("/var/tmp/memcached") os.chdir("/var/tmp/memcached") def __pidFile(self): # 獲取pid文件,帶路徑 '''/var/tmp/memcached/memcached.pid''' return os.path.join(self.workdir,"%s.pid" % self.name) def __writePid(self): # 將pid寫進pid文件中,pid為字符串類型 if self.pid: with open(self.__pidFile(),"w") as fd: fd.write(str(self.pid)) def start(self): pid = self.__getPid() # 判斷進程,如已存在則退出 if pid: print ("%s is running" % self.name) sys.exit() self.__workDir() cmd = self.program + " " + self.argv p = Popen(cmd,stdout=PIPE,shell=True) # 啟動進程方式 self.pid = p.pid # 加self,聲明為類的屬性,便於其他內部函數調用 self.__writePid() print("%s start successful" % self.name) def __getPid(self): p = Popen(["pidof",self.name],stdout=PIPE) # 獲取pid方式 pid = p.stdout.read().strip() # 過濾pid return pid def stop(self): pid = self.__getPid() if pid: os.kill(int(pid),15) # 殺掉進程方式,pid為數值類型 if os.path.exists(self.__pidFile()): os.remove(self.__pidFile()) # 刪掉pid文件 print("%s is stopped" % self.name) def restart(self): self.stop() self.start() def status(self): pid = self.__getPid() if pid: print ("%s is running" % self.name) else: print ("%s is not running" % self.name) def help(self): print ("Usage: %s {start|stop|restart|status}" % __file__) def main(): name = "memcached" program = "/data/program/memcached/bin/memcached" workdir = "/var/tmp/memcached" argv = "-u nobody -p 11211 -c 1024 -m 64" pm = Process(name = name, program = program, workdir = workdir, argv = argv) # 傳參,也可以按順序只寫實參 try: cmd = sys.argv[1] # 如啟動參數有誤,則拋出異常,並退出 except Exception as e: raise e sys.exit() if cmd == "start": pm.start() elif cmd == "stop": pm.stop() elif cmd == "restart": pm.restart() elif cmd == "status": pm.status() else: pm.help() if __name__ == "__main__": main()
二、後臺模式
說明:後臺方式:-d -P XXX.pid ;如有配置文件,則配置文件參數替換掉默認參數
#!/usr/bin/env python #encoding:utf-8 import sys import os from subprocess import Popen, PIPE class Process(object): '''memcached rc script''' argv = {"USER": "memcached", "PORT": "11211", "MAXCONN": "1024", "CACHESIZE": "64", "OPTIONS": ""} # 默認啟動參數 def __init__(self,name,program,workdir): # 初始化類,包含:self、程序名、程序啟動文件、pid文件路徑 self.name = name self.program = program self.workdir = workdir def __readConf(self,f): # 讀取配置文件,返回字典 with open(f,"r") as fd: lines = fd.readlines() return dict([i.strip().split("=") for i in lines]) def __parseArgv(self): # 配置文件替換默認參數 '''/etc/sysconfig/memcached''' conf = self.__readConf("/etc/sysconfig/memcached") if "USER" in conf: self.argv["USER"] = conf["USER"] if "PORT" in conf: self.argv["PORT"] = conf["PORT"] if "MAXCONN" in conf: self.argv["MAXCONN"] = conf["MAXCONN"] if "CACHESIZE" in conf: self.argv["CACHESIZE"] = conf["CACHESIZE"] options = ["-u",self.argv["USER"], "-p",self.argv["PORT"], "-m",self.argv["CACHESIZE"], "-c",self.argv["MAXCONN"]] # 替換的參數,以列表形式返回 os.system("chown %s %s" % (self.argv["USER"],self.workdir)) # 修改pid文件目錄的屬主為啟動用戶,才能寫pid文件 print ("啟動參數為:%s" % str(options)) return options def __workDir(self): # 判斷pid文件路徑,沒有則創建 '''/var/tmp/memcached''' if not os.path.exists("/var/tmp/memcached"): os.mkdir("/var/tmp/memcached") os.chdir("/var/tmp/memcached") def __pidFile(self): # 獲取pid文件,帶路徑 '''/var/tmp/memcached/memcached.pid''' return os.path.join(self.workdir,"%s.pid" % self.name) def start(self): pid = self.__getPid() if pid: print ("%s is running" % self.name) sys.exit() self.__workDir() cmd = [self.program] + self.__parseArgv() + ["-d", "-P", self.__pidFile()] # 啟動參數,後臺啟動方式,按指定文件自動寫pid p = Popen(cmd,stdout=PIPE) # 啟動進程方式 print("%s start successful" % self.name) def __getPid(self): p = Popen(["pidof",self.name],stdout=PIPE) # 獲取pid方式 pid = p.stdout.read().strip() # 過濾pid return pid def stop(self): pid = self.__getPid() if pid: os.kill(int(pid),15) # 殺掉進程方式,pid為數值類型 if os.path.exists(self.__pidFile()): os.remove(self.__pidFile()) # 刪掉pid文件 print("%s is stopped" % self.name) def restart(self): self.stop() self.start() def status(self): pid = self.__getPid() if pid: print ("%s is running" % self.name) else: print ("%s is not running" % self.name) def help(self): print ("Usage: %s {start|stop|restart|status}" % __file__) def main(): name = "memcached" program = "/data/program/memcached/bin/memcached" workdir = "/var/tmp/memcached" pm = Process(name = name, program = program, workdir = workdir) # 傳參,也可以按順序只寫實參 try: cmd = sys.argv[1] # 如啟動參數有誤,則拋出異常,並退出 except Exception as e: raise e sys.exit() if cmd == "start": pm.start() elif cmd == "stop": pm.stop() elif cmd == "restart": pm.restart() elif cmd == "status": pm.status() else: pm.help() if __name__ == "__main__": main()
python—memcached啟動腳本