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运算符重载用法实例分析
Jun 01 Python
python抓取并保存html页面时乱码问题的解决方法
Jul 01 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
numpy.transpose对三维数组的转置方法
Apr 17 Python
python操作excel文件并输出txt文件的实例
Jul 10 Python
Python使用googletrans报错的解决方法
Sep 25 Python
浅析Python函数式编程
Oct 06 Python
Opencv+Python 色彩通道拆分及合并的示例
Dec 08 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
Pytorch之parameters的使用
Dec 31 Python
python interpolate插值实例
Jul 06 Python
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
Jun 11 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 Mysql类 可以参考学习熟悉下
2009/06/21 PHP
php实现高效获取图片尺寸的方法
2014/12/12 PHP
php银联网页支付实现方法
2015/03/04 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
一个js过滤空格的小函数
2014/10/10 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
Python打印输出数组中全部元素
2018/03/13 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
法国足球商店:Footcenter
2019/07/06 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
Java语言程序设计测试题选择题部分
2014/04/03 面试题
出纳岗位职责
2013/11/09 职场文书
面包店的创业计划书范文
2014/01/16 职场文书
初中英语教学反思
2014/01/25 职场文书
期末评语大全
2014/05/04 职场文书
2016年校长新年寄语
2015/08/17 职场文书