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使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
Python中方法链的使用方法
Feb 23 Python
python批量制作雷达图的实现方法
Jul 26 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
Mar 16 Python
对python判断是否回文数的实例详解
Feb 08 Python
Python2与Python3的区别点整理
Dec 12 Python
如何在mac环境中用python处理protobuf
Dec 25 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
Apr 30 Python
Python drop方法删除列之inplace参数实例
Jun 27 Python
python实现简单文件读写函数
Feb 25 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
收藏的PHP常用函数 推荐收藏保存
2010/02/21 PHP
php表单敏感字符过滤类
2014/12/08 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
php微信开发之关注事件
2018/06/14 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
js 数组克隆方法 小结
2010/03/20 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
js html实现计算器功能
2018/11/13 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
Python 多线程的实例详解
2017/09/07 Python
python/sympy求解矩阵方程的方法
2018/11/08 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
python整合ffmpeg实现视频文件的批量转换
2019/05/31 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
高级人员简历的自我评价分享
2013/11/03 职场文书
服装公司总经理岗位职责
2013/11/30 职场文书
个人职业生涯规划书1500字
2013/12/31 职场文书
应用艺术专业个人的自我评价
2014/01/03 职场文书
个人充满哲理的自我评价
2014/02/20 职场文书
会计系毕业生求职信
2014/05/28 职场文书
教室标语大全
2014/06/21 职场文书
市场策划求职信
2014/08/07 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
2014年变电站工作总结
2014/12/19 职场文书