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中__name__的使用实例
Apr 14 Python
django缓存配置的几种方法详解
Jul 16 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
利用python循环创建多个文件的方法
Oct 25 Python
使用Pandas对数据进行筛选和排序的实现
Jul 29 Python
python打包成so文件过程解析
Sep 28 Python
DJANGO-URL反向解析REVERSE实例讲解
Oct 25 Python
python使用梯度下降算法实现一个多线性回归
Mar 24 Python
全网首秀之Pycharm十大实用技巧(推荐)
Apr 27 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
Python如何配置环境变量详解
May 18 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
索尼ICF-SW100收音机评测
2021/03/02 无线电
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
PHP对文件进行加锁、解锁实例
2015/01/23 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
phpStorm2020 注册码
2020/09/17 PHP
jquery入门—访问DOM对象方法
2013/01/07 Javascript
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
python 统计代码行数简单实例
2017/05/04 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
2019/12/27 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Python 在函数上添加包装器
2020/07/28 Python
ajax是什么及其工作原理
2012/02/08 面试题
班级入场式解说词
2014/02/01 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
敬业奉献模范事迹材料(2016精选版)
2016/02/26 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
变长双向rnn的正确使用姿势教学
2021/05/31 Python
基于JavaScript实现年月日三级联动
2021/06/22 Javascript
Nginx实现负载均衡的项目实践
2022/03/18 Servers
python_tkinter事件类型详情
2022/03/20 Python