1. 程式人生 > >python—memcached啟動腳本

python—memcached啟動腳本

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啟動腳本