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中的reduce内建函数使用方法指南
Aug 31 Python
Python 数据结构之队列的实现
Jan 22 Python
Python模块结构与布局操作方法实例分析
Jul 24 Python
Python中用psycopg2模块操作PostgreSQL方法
Nov 28 Python
Python中一些深不见底的“坑”
Jun 12 Python
python实现ip代理池功能示例
Jul 05 Python
基于django ManyToMany 使用的注意事项详解
Aug 09 Python
关于python字符串方法分类详解
Aug 20 Python
离线状态下在jupyter notebook中使用plotly实例
Apr 24 Python
Python数据可视化图实现过程详解
Jun 12 Python
Python自动化操作实现图例绘制
Jul 09 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 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
mysql5的sql文件导入到mysql4的方法
2008/10/19 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
javascript 新浪背投广告实现代码
2009/07/07 Javascript
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
js三种排序算法分享
2012/08/16 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
js控制台输出的方法(详解)
2016/11/26 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
[01:00:44]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第三局
2016/03/04 DOTA
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
基于Python fminunc 的替代方法
2020/02/29 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
大学生毕业自我评价范文分享
2013/11/11 职场文书
自我鉴定标准格式
2014/03/19 职场文书
开展创先争优活动总结
2014/08/28 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
全陪导游词开场白
2015/05/29 职场文书
致青春观后感
2015/06/09 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技