开发者社区> 余二五> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

rc脚本(类的定义与脚本的结构、start方法、stop和status方法、以daemon方式启动)

简介:
+关注继续查看

rc脚本

1、安装memcached
yum install memcached -y
2、启动命令
-d:daemon启动(后台启动)
-p 端口
-u 指定哪个用户启动 
-m 指定内存
-c 指定连接数 
-P 指定pid

memcached -d -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached.pid

参数化:
class Myclass(object):
    def __init__(self,name):
        self.name=name
        print 'I am %s' %self.name
cn=Myclass('wo')

结果:
I am wo

备注:linux执行命令Popen、call:
标准输出传给管道(PIPE)
In [52]: subprocess.call('ls /root',shell=True)
123.txt anaconda-ks.cfg python shell test venv
Out[52]: 0

In [47]: PP=Popen(['ls','/root'],stdout=PIPE)
In [48]: tt=PP.stdout.read().strip()
In [49]: tt
Out[49]: '123.txt\nanaconda-ks.cfg\npython\nshell\ntest\nvenv'

3、先定义一个脚本的结构

import os
import sys
from subprocess import Popen,PIPE   #这个是执行linux命令的
class Program(object):
    '''memcached rc.script'''
    def __init__(self,name,program,args,workdir): #初始化函数时定义参数
        self.name=name    #main函数实例化的时候传入参数,将其作为类的属性
        self.program=program
        self.args=args
        self.workdir=workdir

    def _int(self):     #只有一个下划线,就是一个类的方法
        '''/var/tmp/memcached'''
        if not os.path.exists(self.workdir): #判断当这个路径不存在时
            os.mkdir(self.workdir)       #创建这个目录mkdir /var/tmp/memcached
            os.chdir(self.workdir)       #进入这个目录,cd /var/tmp/memcached

    def _pidFile(self):#为了输出‘/var/tmp/memcached/memcached.pid’
        '''/var/tmp/memcached/memcached.pid'''
        return os.path.join(self.workdir,"%s.pid" %self.name)

    def _writePid(self):#写入pid到文件里
        if self.pid:                    #判断这个pid是否存在,这个是在start函数定义
            with open(self._pidFile(),'w') as fd:#打开pid文件,在上面方法中定义
                fd.write(str(self.pid)+'\n')   #需要转换为字符串才能写入

    def start(self):                #启动
        self._int()                 #判断/var/tmp/memcached存在
        cmd=self.program + ' ' + self.args #执行命令
        p=Popen(cmd,stdout=PIPE,shell=True)#执行cmd命令,标准输出,True表示正确的输出
        self.pid=p.pid
        self._writePid()
        print '%s successing ...' %self.name

    def stop(self):
        pass

    def restart(self):
        self.start()
        self.stop()
    def status(self):
        pass

    def help(self):
        print 'Usage:{start|stop|status|restart}'
def main():  #定义一个主函数
    name='memcached' #定义参数
    program='/usr/bin/memcached'
    args='-u memcached -p 11211 -c 1023 -m 64'
    wd='/var/tmp/memcached'
    pe=Program(name=name,           #将类实例化才能调用构建函数
               program=program,
               args=args,
               workdir=wd)
    try:                            #异常处理,必须接上一个参数
        cmd=sys.argv[1]
    except IndexError,e:
        print 'Option error'        #若没有参数,则打印
        sys.exit(1)                 #退出脚本
    if cmd == 'start':
        pe.start()
    elif cmd == 'stop':
        pe.stop()
    elif cmd == 'resatrt':
        pe.restart()
    elif cmd == 'status':
        pe.status()
    else:
        pe.help()

if __name__=='__main__':        #函数是主函数,就执行main()
    main()
import os
import sys
from subprocess import Popen,PIPE   #这个是执行linux命令的
class Program(object):
    '''memcached rc.script'''
    def __init__(self,name,program,args,workdir): #初始化函数时定义参数
        self.name=name    #main函数实例化的时候传入参数,将其作为类的属性
        self.program=program
        self.args=args
        self.workdir=workdir

    def _int(self):     #只有一个下划线,就是一个类的方法
        '''/var/tmp/memcached'''
        if not os.path.exists(self.workdir): #判断当这个路径不存在时
            os.mkdir(self.workdir)       #创建这个目录mkdir /var/tmp/memcached
            os.chdir(self.workdir)       #进入这个目录,cd /var/tmp/memcached

    def _pidFile(self):#为了输出‘/var/tmp/memcached/memcached.pid’
        '''/var/tmp/memcached/memcached.pid'''
        return os.path.join(self.workdir,"%s.pid" %self.name)

    def _writePid(self):#写入pid到文件里
        if self.pid:                    #判断这个pid是否存在,这个是在start函数定义
            with open(self._pidFile(),'w') as fd:#打开pid文件,在上面方法中定义
                fd.write(str(self.pid)+'\n')   #需要转换为字符串才能写入

    def start(self):                #启动
        pid=self._getPid()          #判断下是否正在运行,若是的话就不要启动了,退出
        if pid:                     #这样的好处是以免产生不一样的pid
            print '%s is running...' %self.name
            sys.exit(2)
        self._int()                 #判断/var/tmp/memcached存在
        cmd=self.program + ' ' + self.args #执行命令
        p=Popen(cmd,stdout=PIPE,shell=True)#执行cmd命令,标准输出,True表示正确的输出
        self.pid=p.pid
        self._writePid()
        print '%s successing ...' %self.name

    def _getPid(self):              #获取到pid后,再kill掉
        p=Popen(['pidof',self.name],stdout=PIPE) #pidof表示memcache的pid
        pid=p.stdout.read().strip()
        return pid
    def stop(self):
        pid=self._getPid()          #调用类的方法
        if pid:                    #如果pid存在,则kill -9 pid(这个pid必须要是int)
            os.kill(int(pid),9)
            if os.path.exists(self._pidFile()): #判断pid文件是否存在
                os.remove(self._pidFile())      #删除
            print '%s is stoped...' %self.name

    def restart(self):
        self.start()
        self.stop()
    def status(self):       #判断pid,若存在就运行,不存在就停止
        pid=self._getPid()
        if pid:
            print '%s is running...' %self.name
        else:
            print '%s is stoped...' %self.name

    def help(self):                 #__file__和shell里的$0类似,就是脚本名称
        print 'Usage:%s {start|stop|status|restart}' %__file__
def main():  #定义一个主函数
    name='memcached' #定义参数
    program='/usr/bin/memcached'
    args='-u memcached -p 11211 -c 1023 -m 64'
    wd='/var/tmp/memcached'
    pe=Program(name=name,           #将类实例化才能调用构建函数
               program=program,
               args=args,
               workdir=wd)
    try:                            #异常处理,必须接上一个参数
        cmd=sys.argv[1]
    except IndexError,e:
        print 'Option error'        #若没有参数,则打印
        sys.exit(1)                 #退出脚本
    if cmd == 'start':
        pe.start()
    elif cmd == 'stop':
        pe.stop()
    elif cmd == 'restart':
        pe.restart()
    elif cmd == 'status':
        pe.status()
    else:
        pe.help()

if __name__=='__main__':        #函数是主函数,就执行main()
    main()

备注:linux shell下执行命令:

cmd 为一个列表,就是将列表的执行:
命令如下
/usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024 -d -P /var/run/memcached/mecached.pid

rc脚本(类的定义与脚本的结构、start方法、stop和status方法、以daemon方式启动)










本文转自 iekegz 51CTO博客,原文链接:http://blog.51cto.com/jacksoner/2060867,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Django之路——9 Django的form组件的信息校验
forms组件 校验字段功能 针对一个实例:注册用户讲解。 模型:models.py class UserInfo(models.Model): name=models.
1267 0
PyCharm 2018 for mac 数据库实战:链接SQLite、建表、添加、查询数据
一、前言 最近开始入门python,当然是要使用PyCharm,然后在项目中遇到.db数据库文件,双击打不开?网上找到了windows版本的教程,版本也比较旧,所以有空就来一发,当备忘也好~ 二、链接SQLite 2.
2358 0
机器学习PAI-DSW交互式建模个人版有奖评测活动
如果你是一名算法工程师或正在学习和转型,欢迎参加PAI-DSW交互式建模有奖评测,和我们一起建设AI模型构建最佳平台,期待听到你的悄悄话哦~
0 0
SegmentFault D-Day 上海站圆桌:一切都有关 React
我们在今年的 SegmentFault D-Day 技术沙龙里加入了别具一格的「圆桌讨论」环节,圆桌偏重的是技术热点、成长历程以及创业路上的经验交流,和主体的严肃议题分享形成互补,就是为了做出更加 SegmentFault 式的沙龙体验,让技术与实际经验结合,让普通开发者与大牛更深入地交流。
0 0
SAP CRM Document header的结构分析
SAP CRM Document header的结构分析
0 0
Dart 代码的组件集合Dart VM2
这是我参与8月更文挑战的第 7 天,活动详情查看:8月更文挑战。为应掘金的八月更文挑战, Dart 代码的组件集合Dart VM 2
0 0
Dart 代码的组件集合Dart VM3
这是我参与8月更文挑战的第 8 天,活动详情查看:8月更文挑战。为应掘金的八月更文挑战, 通过 JIT 运行源代码 本节将介绍当从命令行执行 Dart 时会发生什么:
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载