Python编写memcached启动脚本

    测试环境:CentOS 7

    Python版本: 2.7

    安装memcached:输入下面命令安装并用脚本测试

1
yum install 
-
y memcached libmemcached libevent

   测试方法:把脚本内容粘贴到rc.py文件中,shell下运行如果下命令:

1
python rc.py start

一、rc 脚本的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
#/usr/bin/env python
# -*- coding:utf-8 -*-
# @time   :2018/1/12 19:11
# @Author :FengXiaoqing
# @file   :rc.py
import 
os
import 
sys
from 
subprocess 
import 
Popen,PIPE
class 
Process(
object
):
    
'''memcached rc script'''
    
def 
__init__(
self
,name,program,args,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 
_writhPid(
self
):
        
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 already runnig..." 
% 
self
.name
            
sys.exit()
        
self
._init()
        
cmd 
= 
self
.program 
+ 
' ' 
+ 
self
.args
        

= 
Popen(cmd,stdout
=
PIPE,shell
=
True
)
        
self
.pid 
= 
p.pid
        
self
._writhPid()
        
print 
"%s start Sucessful.." 
% 
self
.name
 
    
def 
_getPid(
self
):
        

= 
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'
    
wd 
= 
'/var/tmp/memcached'
    
pm 
= 
Process(name 
= 
name,
                 
program
=
prog,
                 
args
=
args,
                 
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()

二、rc脚本的(以daemon方式启动)

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
#/usr/bin/env python
# -*- coding:utf-8 -*-
# @time   :2018/1/12 21:18
# @Author :FengXiaoqing
# @file   :rc-d.py
import 
os
import 
sys
from 
subprocess 
import 
Popen,PIPE
class 
Process(
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
.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 
_writhPid(
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 

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[
'MAXCONN'
],
                   
'-c'
,
self
.args[
'CACHESIZE'
]] 
        
return 
options
    
def 
start(
self
):
        
pid 
= 
self
._getPid()
        
if 
pid:
            
print 
"%s is already runnig..." 
% 
self
.name
            
sys.exit()
        
self
._init()
        
cmd 
= 
[
self
.program]
+
self
._parseArgs()
+
[
'-d'
,
'-P'
,
self
._pidFile()]
        

= 
Popen(cmd,stdout
=
PIPE)
        
print 
"%s start Sucessful.." 
% 
self
.name
    
def 
_getPid(
self
):
        

= 
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'
    
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()