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写的图片蜘蛛人代码
Aug 27 Python
python常规方法实现数组的全排列
Mar 17 Python
查看Python安装路径以及安装包路径小技巧
Apr 28 Python
python利用正则表达式排除集合中字符的功能示例
Oct 10 Python
python3 selenium 切换窗口的几种方法小结
May 21 Python
Windows下python3.7安装教程
Jul 31 Python
influx+grafana自定义python采集数据和一些坑的总结
Sep 17 Python
Python数据集切分实例
Dec 08 Python
在python中利用numpy求解多项式以及多项式拟合的方法
Jul 03 Python
Django 静态文件配置过程详解
Jul 23 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 Python
Python3.8官网文档之类的基础语法阅读
Sep 04 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生成静态页的实现方法
2013/05/10 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
php简单实现MVC
2015/02/05 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
PHP连接MSSQL方法汇总
2016/02/05 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
js获取变量
2006/08/24 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
JS中三目运算符和if else的区别分析与示例
2014/11/21 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
Vue实现选择城市功能
2017/05/27 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
2019/10/21 Javascript
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
python字典快速保存于读取的方法
2018/03/23 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
python中字典增加和删除使用方法
2020/09/30 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
CSS3 网页下拉菜单代码解释 中文翻译
2010/02/27 HTML / CSS
浅谈css3中的前缀
2016/07/20 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
交通事故和解协议书
2014/09/25 职场文书
复试通知单模板
2015/04/24 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL