1 # 模块:
2 # 模块是Python组织代码的基本方式。
3 # 一个Python脚本可以单独运行,也可以导入到另一个脚本中运行,当脚本被导入运行时,我们将其称为模块(module)。
4 # 所有的.py文件都可以作为一个模块导入
5 # 模块名与脚本的文件名相同
6 # 例如我们编写了一个名为hello.py的脚本,则可以在另一个脚本中用import hello语句来导入它。
7 # 包:
8 # Python的模块可以按目录组织为包
9 # 创建一个包的步骤:
10 # 创建一个名字为包名的目录
11 # 在该目录下创建一个__init__.py文件
12 # 根据需要,在该目录下存放脚本文件或已编译的扩展及子包
13 # 面向对象介绍:
14 # 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。
15 # OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
16 # 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。
17 # 为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
18 # 而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
19 # 在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
20 # 类的属性:
21 # 类的属性按使用范围分为公有属性和私有属性,类的属性范围取决于属性的名称。
22 # 公有属性:在类中和类外都能调用的属性。
23 # 私有属性:不能在类外及被类以外的函数调用。
24 # 定义方式:以”__”双下划线开始的成员变量就是私有属性
25 # 可以通过instance._classname__attribute方式访问。
26 # 内置属性:由系统在定义类的时候默认添加的,由前后双下划线构成,__dict__, __module__。
27 # 类的方法:
28 # 方法的定义和函数一样,但是需要self作为第一个参数。
29 # 类方法为:
30 # 公有方法
31 # 私有方法
32 # 类方法
33 # 静态方法
34 # 公有方法:在类中和类外都能调用的方法。
35 # 私有方法:不能被类的外部调用,在方法前面加上”__”双下划线就是私有方法。
36 # self参数
37 # 用于区分函数和类的方法(必须有一个self),self参数表示执行对象本身。
38 # 类方法:被classmethod()
39 # 函数处理过的函数,能被类所调用,也能被对象所调用(是继承的关系)
40 # 静态方法:相当于”全局函数”,可以被类直接调用,可以被所有实例化对象共享,通过staticmethod()
41 # 定义,静态方法没有”self”参数。
42 # 装饰器:
43 # - @ classmethod
44 # - @ staticmethod
45 # 类的内置方法:
46 # 方法1:直接使用外部类调用内部类
47 # object_name = outclass_name.inclass_name()
48 # 方法2:先对外部类进行实例化,然后再实例化内部类
49 # out_name = outclass_name()
50 # in_name = out_name.inclass_name()
51 # in_name.method()
52 # 类的继承:
53 # 即一个派生类(derived class )继承基类(base class )的字段和方法。
54 # 继承也允许把一个派生类的对象作为一个基类对象对待。
55 # 例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
56
57 # rc:
58 import sys
59 import os
60 from subprocess import Popen, PIPE
61
62 class Process(object):
63 '''memcached rc script'''
64 def __init__(self, name, program, args, workdir):
65 self.name = name
66 self.program = program
67 self.args = args
68 self.workdir = workdir
69
70 def _init(self):
71 '''/var/tmp/memcached'''
72 if not os.path.exists(self.workdir):
73 os.mkdir(self.workdir)
74 os.chdir(self.workdir)
75
76 def _pidFile(self):
77 '''/var/tmp/memcached/memcached.pid'''
78 return os.path.join(self.workdir, "%s.pid" % self.name)
79
80 def _writhPid(self):
81 if self.pid:
82 with open(self._pidFile(), 'w') as fd:
83 fd.write(str(self.pid))
84
85 def start(self):
86 pid = self._getPid()
87 if pid:
88 print "%s is running..." % self.name
89 sys.exit()
90 self._init()
91 cmd = self.program + ' ' + self.args
92 p = Popen(cmd, stdout=PIPE, shell=True)
93 self.pid = p.pid
94 self._writhPid()
95 print "%s start Sucessful" % self.name
96
97 def _getPid(self):
98 p = Popen(['pidof', self.name], stdout=PIPE)
99 pid = p.stdout.read().strip()
100 return pid
101
102 def stop(self):
103 pid = self._getPid()
104 if pid:
105 os.kill(int(pid), 15)
106 if os.path.exists(self._pidFile()):
107 os.remove(self._pidFile())
108 print "%s is stopped" % self.name
109
110 def restart(self):
111 self.stop()
112 self.start()
113
114 def status(self):
115 pid = self._getPid()
116 if pid:
117 print "%s is already running" % self.name
118 else:
119 print "%s is not running" % self.name
120
121 def help(self):
122 print "Usage: %s {start|stop|status|restart}" % __file__
123
124 def main():
125 name = 'memcached'
126 prog = '/usr/bin/memcached'
127 args = '-u nobody -p 11211 -c 1024 -m 64'
128 wd = '/var/tmp/memcached'
129 pm = Process(name = name,
130 program = prog,
131 args = args,
132 workdir = wd)
133 try:
134 cmd = sys.argv[1]
135 except IndexError, e:
136 print "Option error"
137 sys.exit()
138 if cmd == 'start':
139 pm.start()
140 elif cmd == 'stop':
141 pm.stop()
142 elif cmd == 'restart':
143 pm.restart()
144 elif cmd == 'status':
145 pm.status()
146 else:
147 pm.help()
148
149 if __name__ == '__main__':
150 main()