死siua11 发表于 2018-8-13 08:19:54

python—memcached启动脚本

#!/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()
  

  
    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.__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# 如启动参数有误,则抛出异常,并退出
  

  
    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()
页: [1]
查看完整版本: python—memcached启动脚本