使用 python 实现 memcached 的启动服务脚本 rc
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 python 实现 memcached 的启动服务脚本 rc相关的知识,希望对你有一定的参考价值。
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
|
#!/usr/bin/python #coding:utf-8 import sys import os from subprocess import Popen, PIPE class Memcached( object ): ‘‘‘ memcached rc script ‘‘‘ args = { ‘USER‘ : ‘memcached‘ , ‘PORT‘ : 11211 , ‘MAXCONN‘ : 1024 , ‘CACHESIZE‘ : 64 , ‘OPTIONS‘ :‘‘} def __init__( self , name, program, workdir): self .name = name self .program = program #self.args = args 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)) ‘‘‘ 这个地方要修改工作目录的权限,用户为memcached,需要有写目录的权限。 ‘‘‘ 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()] print cmd p = Popen(cmd, stdout = PIPE) #self.pid = p.pid #self._writePid() # 如果程序选项中有-P选项,那么应用程序会自动去写pid文件,不用手动去写,而且要注意pid与手动写入的pid有何区别。 print ‘%s start Sucessful‘ % 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‘ % 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‘ wdir = ‘/var/tmp/memcached‘ rc = Memcached(name, prog, wdir) try : cmd = sys.argv[ 1 ] except IndexError, e: print "Option error" sys.exit() if cmd = = ‘start‘ : rc.start() elif cmd = = ‘stop‘ : rc.stop() elif cmd = = ‘restart‘ : rc.restart() elif cmd = = ‘status‘ : rc.status() else : rc. help () if __name__ = = ‘__main__‘ : main() |