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方式启动)


本文转自 jiekegz  51CTO博客,原文链接:http://blog.51cto.com/jacksoner/2060867



相关文章
|
1天前
|
Shell Android开发 开发者
Android系统 自定义动态修改init.custom.rc
Android系统 自定义动态修改init.custom.rc
7 0
|
7月前
|
运维 Linux Apache
如何使用`systemctl status`命令来查看服务状态?
如何使用`systemctl status`命令来查看服务状态?
466 0
|
7月前
|
安全 Java API
为什么启动线程不直接调用run(),而要调用start(),如果调用两次start()方法会有什么后果
1位工作6年的小伙伴去某里P6一面,被问到这样一道面试题,说,为什么启动一个线程不直接调用run()方法,而要调用start()方法来启动,如果调用两次start()会有什么后果?
61 0
|
9月前
|
开发工具
编写start、stop、status三个脚本程序,用来启动、停止各种系统服务。
编写start、stop、status三个脚本程序,用来启动、停止各种系统服务。
90 0
|
9月前
脚本文件stop和status与start类似,这里不再描述。
脚本文件stop和status与start类似,这里不再描述。
30 0
|
开发框架 .NET API
Andrid 9.0 init.rc中增加启动自定义service
Andrid 9.0 init.rc中增加启动自定义service
487 0
Andrid 7.1 启动init.rc中自定义service
Andrid 7.1 启动init.rc中自定义service
128 0
start 与 run 区别
start 与 run 区别
117 0
|
Java 调度
启动一个线程是调用run()还是start()方法?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调(callback)的方法。
1325 0
在windowService用Process.Start()启动程序没有界面-记录
原文:在windowService用Process.Start()启动程序没有界面-记录 1.在服务程序安装时编程实现,ProjectInstaller.cs   using System; using System.
943 0

热门文章

最新文章