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框架结合memcached页面改善博客性能
Apr 24 Python
Python yield 使用浅析
May 28 Python
详解Python中的__new__、__init__、__call__三个特殊方法
Jun 02 Python
Python常见异常分类与处理方法
Jun 04 Python
python八大排序算法速度实例对比
Dec 06 Python
python如何实现一个刷网页小程序
Nov 27 Python
python字符串循环左移
Mar 08 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
python函数map()和partial()的知识点总结
May 26 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
Oct 15 Python
python爬虫使用scrapy注意事项
Nov 23 Python
解决PyCharm无法使用lxml库的问题(图解)
Dec 22 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查看session内容的函数
2008/08/27 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
phpmailer绑定邮箱的实现方法
2016/12/01 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
关于js datetime的那点事
2011/11/15 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
JavaScript实现简单计算器功能
2019/12/19 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
python实现定制交互式命令行的方法
2014/07/03 Python
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
python之PyMongo使用总结
2017/05/26 Python
Python之os操作方法(详解)
2017/06/15 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
django 消息框架 message使用详解
2019/07/22 Python
Django更新models数据库结构步骤
2020/04/01 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
日本最大的购物网站乐天市场国际版:Rakuten Global Market(支持中文)
2020/02/03 全球购物
房屋出售授权委托书
2014/10/12 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
导游词之新疆-喀纳斯
2019/10/10 职场文书
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技