1. 程式人生 > >rc腳本(類的定義與腳本的結構、start方法、stop和status方法、以daemon方式啟動)

rc腳本(類的定義與腳本的結構、start方法、stop和status方法、以daemon方式啟動)

rom bin pip 退出 stdout linux命令 rem 參數化 ssi

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方式啟動)