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多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
详解Python之unittest单元测试代码
Jan 24 Python
Python基于百度云文字识别API
Dec 13 Python
python中dict()的高级用法实现
Nov 13 Python
Python实现Wordcloud生成词云图的示例
Mar 30 Python
使用python批量转换文件编码为UTF-8的实现
Apr 03 Python
django rest framework serializers序列化实例
May 13 Python
浅谈Python里面None True False之间的区别
Jul 09 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
Dec 07 Python
python 通过使用Yolact训练数据集
Apr 06 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 Python
PyCharm 配置SSH和SFTP连接远程服务器
May 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
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
PHP XML error parsing SOAP payload on line 1
2010/06/17 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
PHP类的反射用法实例
2014/11/03 PHP
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
JS实现网页标题随机显示名人名言的方法
2015/11/03 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
SVG实现时钟效果
2018/07/17 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
js实现随机点名功能
2020/12/23 Javascript
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
用Python输出一个杨辉三角的例子
2014/06/13 Python
详细介绍Python中的偏函数
2015/04/27 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
利用Python检测URL状态
2019/07/31 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
Python中bisect的用法及示例详解
2020/07/20 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
超市营业员求职简历的自我评价
2013/10/17 职场文书
临床医学应届生求职信
2013/11/06 职场文书
实习单位鉴定评语
2014/04/26 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
老人节主持词
2015/07/04 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书