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实现问号表达式(?)的方法
Nov 27 Python
简单的Python的curses库使用教程
Apr 11 Python
在Python的Django框架中创建和使用模版
Jul 15 Python
Python在Windows和在Linux下调用动态链接库的教程
Aug 18 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
详解用TensorFlow实现逻辑回归算法
May 02 Python
根据DataFrame某一列的值来选择具体的某一行方法
Jul 03 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
基于Python打造账号共享浏览器功能
May 30 Python
通过实例解析Python调用json模块
Dec 11 Python
Windows 下python3.8环境安装教程图文详解
Mar 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+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
JS+CSS实现DIV层的展开、收缩效果
2016/01/28 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
Python实现购物车购物小程序
2018/04/18 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
python 自定义装饰器实例详解
2019/07/20 Python
opencv实现简单人脸识别
2021/02/19 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
2020/03/09 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
bareMinerals官网:矿物质化妆品和护肤品
2018/02/04 全球购物
建筑学专业自荐书
2014/07/09 职场文书
音乐学专业求职信
2014/07/22 职场文书
影视广告专业求职信
2014/09/02 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
英语辞职信范文
2015/02/28 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
会议承办单位欢迎词
2019/07/09 职场文书