python—memcached启动脚本

简介:

一、一般模式

    启动选项:start、stop、restart、status

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env python
#encoding:utf-8
 
import  sys
import  os
from  subprocess  import  Popen, PIPE
 
class  Process( object ):
     '''memcached rc script'''
     def  __init__( self ,name,program,argv,workdir):   # 初始化类,包含:self、程序名、程序启动文件、执行参数、pid文件路径
         self .name  =  name
         self .program  =  program
         self .argv  =  argv
         self .workdir  =  workdir
      
         
     def  __workDir( self ):    # 判断pid文件路径,没有则创建
         '''/var/tmp/memcached'''
         if  not  os.path.exists( "/var/tmp/memcached" ):
             os.mkdir( "/var/tmp/memcached" )
             os.chdir( "/var/tmp/memcached" )
             
     def  __pidFile( self ):    # 获取pid文件,带路径
         '''/var/tmp/memcached/memcached.pid'''
         return  os.path.join( self .workdir, "%s.pid"  %  self .name)
         
     def  __writePid( self ):   # 将pid写进pid文件中,pid为字符串类型
         if  self .pid:
             with  open ( self .__pidFile(), "w" ) as fd:
                 fd.write( str ( self .pid))
                 
     def  start( self ):
         pid  =  self .__getPid()    # 判断进程,如已存在则退出
         if  pid:
             print  ( "%s is running"  %  self .name)
             sys.exit()
       
         self .__workDir()
         cmd  =  self .program  +  " "  +  self .argv
         =  Popen(cmd,stdout = PIPE,shell = True )    # 启动进程方式
         self .pid  =  p.pid      # 加self,声明为类的属性,便于其他内部函数调用
         self .__writePid()
         print ( "%s start successful"  %  self .name)
      
         
     def  __getPid( self ):
         =  Popen([ "pidof" , self .name],stdout = PIPE)   # 获取pid方式
         pid  =  p.stdout.read().strip()     # 过滤pid                 
         return  pid
         
     def  stop( self ):
         pid  =  self .__getPid()
         if  pid:
             os.kill( int (pid), 15 )          # 杀掉进程方式,pid为数值类型
             if  os.path.exists( self .__pidFile()):
                 os.remove( self .__pidFile())      # 删掉pid文件
             print ( "%s is stopped"  %  self .name)
      
             
     def  restart( self ):
         self .stop()
         self .start()
      
         
     def  status( self ):
         pid  =  self .__getPid()
         if  pid:
             print  ( "%s is running"  %  self .name)
         else :
             print  ( "%s is not running"  %  self .name)
     
             
     def  help ( self ):
         print  ( "Usage: %s {start|stop|restart|status}"  %  __file__)
     
         
def  main():
     name  =  "memcached"
     program  =  "/data/program/memcached/bin/memcached"
     workdir  =  "/var/tmp/memcached"
     argv  =  "-u nobody -p 11211 -c 1024 -m 64"
     pm  =  Process(name  =  name,
                  program  =  program,
                  workdir  =  workdir,
                  argv  =  argv)     # 传参,也可以按顺序只写实参
     try :
         cmd  =  sys.argv[ 1 ]   # 如启动参数有误,则抛出异常,并退出
    
     except  Exception as e:
         raise  e
         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()



二、后台模式

   说明:后台方式:-d -P XXX.pid ;如有配置文件,则配置文件参数替换掉默认参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/env python
#encoding:utf-8
 
import  sys
import  os
from  subprocess  import  Popen, PIPE
 
class  Process( object ):
     '''memcached rc script'''
      
     argv  =  { "USER" "memcached" ,
             "PORT" "11211" ,
             "MAXCONN" "1024" ,
             "CACHESIZE" "64" ,
             "OPTIONS" : ""}    # 默认启动参数
             
     def  __init__( self ,name,program,workdir):   # 初始化类,包含:self、程序名、程序启动文件、pid文件路径
         self .name  =  name
         self .program  =  program
         self .workdir  =  workdir
     
         
     def  __readConf( self ,f):     # 读取配置文件,返回字典
         with  open (f, "r" ) as fd:
             lines  =  fd.readlines()
             return  dict ([i.strip().split( "=" for  in  lines])
             
     def  __parseArgv( self ):     # 配置文件替换默认参数
     '''/etc/sysconfig/memcached'''
         conf  =  self .__readConf( "/etc/sysconfig/memcached" )
         
         if  "USER"  in  conf:
             self .argv[ "USER" =  conf[ "USER" ]
             
         if  "PORT"  in  conf:
             self .argv[ "PORT" =  conf[ "PORT" ]
             
         if  "MAXCONN"  in  conf:
             self .argv[ "MAXCONN" =  conf[ "MAXCONN" ]
             
         if  "CACHESIZE"  in  conf:
            self .argv[ "CACHESIZE" =  conf[ "CACHESIZE" ]
         
         options  =  [ "-u" , self .argv[ "USER" ],
                    "-p" , self .argv[ "PORT" ],
                    "-m" , self .argv[ "CACHESIZE" ],
                    "-c" , self .argv[ "MAXCONN" ]]   # 替换的参数,以列表形式返回
                    
         os.system( "chown %s %s"  %  ( self .argv[ "USER" ], self .workdir))  # 修改pid文件目录的属主为启动用户,才能写pid文件
         print  ( "启动参数为:%s"  %  str (options))
         return  options
         
     def  __workDir( self ):    # 判断pid文件路径,没有则创建
         '''/var/tmp/memcached'''
         if  not  os.path.exists( "/var/tmp/memcached" ):
             os.mkdir( "/var/tmp/memcached" )
             os.chdir( "/var/tmp/memcached" )
             
     def  __pidFile( self ):    # 获取pid文件,带路径
         '''/var/tmp/memcached/memcached.pid'''
         return  os.path.join( self .workdir, "%s.pid"  %  self .name)
         
     def  start( self ):
         pid  =  self .__getPid()
         if  pid:
             print  ( "%s is running"  %  self .name)
             sys.exit()
       
         self .__workDir()
         cmd  =  [ self .program]  +  self .__parseArgv()  +  [ "-d" "-P" self .__pidFile()]   # 启动参数,后台启动方式,按指定文件自动写pid
         =  Popen(cmd,stdout = PIPE)    # 启动进程方式
         print ( "%s start successful"  %  self .name)
      
         
     def  __getPid( self ):
         =  Popen([ "pidof" , self .name],stdout = PIPE)   # 获取pid方式
         pid  =  p.stdout.read().strip()     # 过滤pid                 
         return  pid
         
     def  stop( self ):
         pid  =  self .__getPid()
         if  pid:
             os.kill( int (pid), 15 )          # 杀掉进程方式,pid为数值类型
             if  os.path.exists( self .__pidFile()):
                 os.remove( self .__pidFile())      # 删掉pid文件
             print ( "%s is stopped"  %  self .name)
      
             
     def  restart( self ):
         self .stop()
         self .start()
      
         
     def  status( self ):
         pid  =  self .__getPid()
         if  pid:
             print  ( "%s is running"  %  self .name)
         else :
             print  ( "%s is not running"  %  self .name)
     
             
     def  help ( self ):
         print  ( "Usage: %s {start|stop|restart|status}"  %  __file__)
      
         
def  main():
     name  =  "memcached"
     program  =  "/data/program/memcached/bin/memcached"
     workdir  =  "/var/tmp/memcached"
     
     pm  =  Process(name  =  name,
                  program  =  program,
                  workdir  =  workdir)     # 传参,也可以按顺序只写实参
     try :
         cmd  =  sys.argv[ 1 ]   # 如启动参数有误,则抛出异常,并退出
    
     except  Exception as e:
         raise  e
         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()









本文转自 huangzp168 51CTO博客,原文链接:http://blog.51cto.com/huangzp/2048280,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
JSON 算法 API
深度分析小红书城API接口,用Python脚本实现
小红书作为以UGC内容为核心的生活方式平台,其非官方API主要通过移动端抓包解析获得,涵盖内容推荐、搜索、笔记详情、用户信息和互动操作等功能。本文分析了其接口体系、认证机制及请求规范,并提供基于Python的调用框架,涉及签名生成、登录态管理与数据解析。需注意非官方接口存在稳定性与合规风险,使用时应遵守平台协议及法律法规。
|
6月前
|
JSON API 数据安全/隐私保护
【干货满满】分享微店API接口到手价,用python脚本实现
微店作为知名社交电商平台,其开放平台提供商品查询、订单管理等API接口。本文介绍如何通过微店API获取商品到手价(含优惠、券等),涵盖认证机制、Python实现及关键说明。
|
6月前
|
JSON API 数据安全/隐私保护
【干货满满】分享淘宝API接口到手价,用python脚本实现
淘宝开放平台通过API可获取商品到手价,结合商品详情与联盟接口实现优惠计算。需使用AppKey、AppSecret及会话密钥认证,调用taobao.tbk.item.info.get接口获取最终价格。代码示例展示签名生成与数据解析流程。
|
6月前
|
JSON API 数据格式
深度分析大麦网API接口,用Python脚本实现
大麦网为国内领先演出票务平台,提供演唱会、话剧、体育赛事等票务服务。本文基于抓包分析其非官方接口,并提供Python调用方案,涵盖演出列表查询、详情获取及城市列表获取。需注意非官方接口存在稳定性风险,使用时应遵守平台规则,控制请求频率,防范封禁与法律风险。适用于个人学习、演出信息监控等场景。
|
6月前
|
JSON API 开发者
深度分析阿里妈妈API接口,用Python脚本实现
阿里妈妈是阿里巴巴旗下营销平台,提供淘宝联盟、直通车等服务,支持推广位管理、商品查询等API功能。本文详解其API调用方法,重点实现商品推广信息(佣金、优惠券)获取,并提供Python实现方案。
|
6月前
|
JSON API 数据安全/隐私保护
深度分析虾皮城API接口,用Python脚本实现
虾皮开放平台提供丰富的API接口,支持商品管理、订单处理及促销信息查询等功能。本文详解API认证机制与调用方法,基于Python实现商品价格及到手价获取方案,适用于电商数据分析与运营。
|
6月前
|
JSON API 数据安全/隐私保护
【干货满满】分享拼多多API接口到手价,用python脚本实现
拼多多开放平台提供商品价格查询API,通过“pdd.ddk.goods.detail”接口可获取商品基础价、优惠券、拼团价等信息。结合client_id、client_secret及签名机制实现身份认证,支持推广位ID获取专属优惠。本文提供完整Python实现,涵盖签名生成、接口调用与价格解析逻辑,适用于比价工具、导购平台等场景。
|
6月前
|
API 数据安全/隐私保护 开发者
深度分析苏宁API接口,用Python脚本实现
深度分析苏宁API接口,用Python脚本实现
|
6月前
|
前端开发 Shell API
深度分析58同城API接口,用Python脚本实现
58同城为国内知名分类信息平台,涵盖房产、招聘、二手车等多领域。本文基于网页抓包与解析,分享其非官方接口的Python实现方案,分析核心接口特性与反爬应对策略,适用于数据学习与信息聚合。注意:非官方接口存在风险,使用需遵守平台规则。
|
6月前
|
JSON API 数据安全/隐私保护
【干货满满】分享京东API接口到手价,用python脚本实现
淘宝开放平台提供丰富API,通过商品详情接口与淘宝联盟接口,可获取含优惠券、满减后的商品到手价。本文介绍基于Python的实现方案,涵盖签名生成、接口调用、价格解析及错误处理,适用于比价工具、导购平台等场景。

推荐镜像

更多