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中类型检查的详细介绍
Feb 13 Python
Python实现针对给定单链表删除指定节点的方法
Apr 12 Python
Python中staticmethod和classmethod的作用与区别
Oct 11 Python
Django Rest framework之认证的实现代码
Dec 17 Python
Python获取一个用户名的组ID过程解析
Sep 03 Python
关于Pytorch MaxUnpool2d中size操作方式
Jan 03 Python
python读取raw binary图片并提取统计信息的实例
Jan 09 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
Jan 13 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
在pycharm中创建django项目的示例代码
May 28 Python
Pandas读取csv时如何设置列名
Jun 02 Python
使用Pytorch训练two-head网络的操作
May 28 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 冲泡冲煮
dedecms模版制作使用方法
2007/04/03 PHP
PHP array 的加法操作代码
2010/07/24 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
php实现留言板功能(代码详解)
2017/03/28 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
Jquery 组合form元素为json格式,asp.net反序列化
2009/07/09 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
2020/07/28 Javascript
详解JavaScript正则表达式之分组匹配及反向引用
2016/03/09 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
2019/06/06 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
python正则表达式match和search用法实例
2015/03/26 Python
浅谈Python基础之I/O模型
2017/05/11 Python
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
python实现IOU计算案例
2020/04/12 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
2015年圣诞节活动总结
2015/03/24 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
初中信息技术教学反思
2016/02/16 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS