设为首页 收藏本站
查看: 664|回复: 0

[经验分享] python—memcached启动脚本

[复制链接]

尚未签到

发表于 2018-8-13 08:19:54 | 显示全部楼层 |阅读模式
#!/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()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-550918-1-1.html 上篇帖子: python学习笔记(一)之列表 下篇帖子: linux下升级python2.0到python3.0
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表