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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

以上是关于rc脚本(类的定义与脚本的结构start方法stop和status方法以daemon方式启动)的主要内容,如果未能解决你的问题,请参考以下文章

CENTOS开机自动加载shell脚本

CentOS7 设置开机自启动脚本

rc.d 脚本默认给定一个“开始”参数?

ubuntu下 rc.local的脚本不运行

+++++++脚本练习之for循环和if语句使用

Ubuntu20.04开机运行自定义脚本