Python编写memcached启动脚本代码实例


Posted in Python onAugust 14, 2020

memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。

memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。

memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的机器上。当表格满了以后,接下来新增的数据会以LRU机制替换掉。由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据库)需要额外的代码更新memcached内的数据。

memcached作为缓存文件服务,默认是操作系统里面是可以直接yum -y install memcached进行安装的。

/etc/init.d/memcached 是属于系统shell编写的管理脚本,下面这个脚本是python脚本编写出来的memcached管理脚本,和shell编写的脚本实现的效果一样。

代码如下

#!/usr/bin/python

import sys
import os
from subprocess import Popen,PIPE

class Process(object):
  '''memached rc script'''
  args = {'USER':'memcached',
      'PORT':11211,
      'MAXCONN':1024,
      'CACHESIZE':64,
      'OPTION':''}

  def __init__(self,name,program,workdir):
    self.name = name
    self.program = program
    self.workdir = workdir

  def _init(self):
    '''/var/tmp/memcached'''
    if not os.path.exists(self.workdir):
      os.mkdir(self.workdir)
      os.chdir(self.workdir)

  def _pidFile(self):
    '''/var/tmp/memcached/memcached.pid'''
    return os.path.join(self.workdir, "%s.pid" % self.name)

  def _writePid(self):
    if self.pid:
      with open(self._pidFile(),'w') as fd:
        fd.write(str(self.pid))


  def _readConf(self,f):
    with open(f) as fd:
      lines = fd.readlines()
      return dict([ i.strip().replace('"','').split('=') for i in lines])

  def _parseArgs(self):
    conf = self._readConf('/etc/sysconfig/memcached')       
    if 'USER' in conf:
      self.args['USER'] = conf['USER']
    if 'PORT' in conf:
      self.args['PORT'] = conf['PORT']
    if 'MAXCONN' in conf:
      self.args['MAXCONN'] = conf['MAXCONN']
    if 'CACHESIZE' in conf:
      self.args['CACHESIZE'] = conf['CACHESIZE']
    options = ['-u',self.args['USER'],
          '-p',self.args['PORT'],
          '-m',self.args['CACHESIZE'],
          '-c',self.args['MAXCONN']]
    os.system("chown %s %s" % (self.args['USER'],self.workdir))
    return options

  def start(self):
    pid = self._getPid()
    if pid:
      print "%s is running..." % self.name
      sys.exit()
    self._init()
    cmd = [self.program] + self._parseArgs() + ['-d','-P',self._pidFile()]
    p = Popen(cmd,stdout=PIPE)
    #self.pid = p.pid
    #self._writePid()
    print "%s start Sucessful \t\t [OK]" % self.name

  def _getPid(self):
    p = Popen(['pidof',self.name],stdout=PIPE)
    pid = p.stdout.read().strip()
    return pid

  def stop(self):
    pid = self._getPid()
    if pid:
      os.kill(int(pid),15)
      if os.path.exists(self._pidFile()):
        os.remove(self._pidFile())
      print "%s is stopped \t\t\t [OK]" % self.name

  def restart(self):
    self.stop()
    self.start()
    

  def status(self):
    pid = self._getPid()
    if pid:
      print "%s is already running" % self.name
    else:
      print "%s is not running" % self.name

  def help(self):
    print "Usage:%s {start|stop|status|restart|} " % __file__

  
def main():
  name = 'memcached'
  prog = '/usr/bin/memcached'
  args = '-u nobody -p 11211 -c 1024 -m 64' 
  wd = '/var/tmp/memcached'
  pm = Process(name = name,
         program = prog,
         workdir = wd)
  try:
    cmd = sys.argv[1]
  except IndexError,e:
    print "Option error"
    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 相关文章推荐
使用Python的Tornado框架实现一个Web端图书展示页面
Jul 11 Python
python如何通过实例方法名字调用方法
Mar 21 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
使用Python实现分别输出每个数组
Dec 06 Python
利用OpenCV和Python实现查找图片差异
Dec 19 Python
python入门之基础语法学习笔记
Feb 08 Python
python 使用递归回溯完美解决八皇后的问题
Feb 26 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
Feb 28 Python
python中plt.imshow与cv2.imshow显示颜色问题
Jul 16 Python
Python自动化测试PO模型封装过程详解
Jun 22 Python
详解非极大值抑制算法之Python实现
Jun 28 Python
Python自动化实战之接口请求的实现
May 30 Python
Python自动巡检H3C交换机实现过程解析
Aug 14 #Python
基于python调用jenkins-cli实现快速发布
Aug 14 #Python
使用tensorflow进行音乐类型的分类
Aug 14 #Python
10行Python代码实现Web自动化管控的示例代码
Aug 14 #Python
如何真正的了解python装饰器
Aug 14 #Python
详解python metaclass(元类)
Aug 13 #Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 #Python
You might like
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
2014/06/22 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
vue随机验证码组件的封装实现
2020/02/19 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
Python常用外部指令执行代码实例
2020/11/05 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
优秀经理事迹材料
2014/02/01 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
公司财务经理岗位职责
2015/04/08 职场文书
起诉书格式范文
2015/05/20 职场文书
酒店开业主持词
2015/07/02 职场文书
运动会加油稿50字
2015/07/21 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL