结合rpyc使用python实现动态升级的方法
动态升级,就是程序不退出的情况下,将其代码更新的策略。假设集群含有多个机器,然后每个机器部署一套程序,当升级的时候就要去所有的上面部署一把。
(1)有个包装程序专门负责接口并检查是否需要更新,当需要更新的时候,下载下来。
(2)动态引用,将实质程序放到独立文件和文件夹下面,通过动态引用,调用的时候reload;
客户端代码:
import rpyc
import sys
def update(remoteHost):
c=rpyc.connect(remoteHost,12233)
content="".join(file("Test.py","r").readlines())
print c.root.update(content)
c.close() ipList=["10.101.92.211","10.101.90.203","10.101.91.239"]
for ip in ipList:
update(ip)
服务器端:
import time,subprocess
from rpyc import Service
from rpyc.utils.server import ThreadedServer
import sys
g_module=None class TimeService(Service):
def exposed_sum(self,a,b):
return a+b
def exposed_show(self,cmd):
#cmd='''grep "FAIL" /home/admin/alisatasknode/taskinfo/*/*/*/*/*/*/*.log '''
return self.do_cmd(cmd)[1]
def do_cmd(self,cmd):
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
return p.returncode, out, err
def exposed_process(self,starttime):
self.modulePath="/home/admin/rpyc-3.3.0/server.py"
global g_module
if g_module is None:
print("none")
g_module=__import__('Test')
else:
print("reload")
g_module=reload(g_module)
Test=getattr(g_module,"Test")
t=Test()
return t.getFailure(starttime)
def exposed_update(self,content):
outfile=open("Test.py","w")
outfile.write(content)
return "OK" s=ThreadedServer(TimeService,port=12233,auto_register=False)
s.start()
在Test.py里面实现真正的逻辑
import subprocess
import os,time class Test():
def do_cmd(self,cmd):
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
return p.returncode, out, err def getFailure(self,starttime):
key="Table not found"
keyfile= key.replace(" ","_")+".txt"
timeArray = time.strptime(starttime,"%Y:%m:%d:%H:%M:%S")
timeStamp = int(time.mktime(timeArray))
print("timeStamp:%s" % (timeStamp))
cmd="grep '%s' /home/admin/alisatasknode/taskinfo/20141222/phoenix/20141221/*/*/*/*.log" % (key)
print("cmd:%s" % (cmd))
r=self.do_cmd(cmd)
print(r[0])
infos=""
if r[0] == 0:
filelist=r[1].split("\n")
for info in filelist:
filename=info.split(":")[0]
#print("filename:%s" % (filename))
if filename.find("taskinfo") < 0:
continue
filestamp=os.path.getmtime(filename)
if filestamp >= timeStamp:
print("timeStamp:%s\tfilestamp:%s\ninfo:%s" % (timeStamp,filestamp,info))
if info.find(key):
infos=infos+"\n"+info
return infos
~
结合rpyc使用python实现动态升级的方法的更多相关文章
- python函数动态参数详解
Python的动态参数: 1,参数前一个"*":在函数中会把传的参数转成一个元组. def func (*args): print(args) func(123,1,2,'a') ...
- Android 插件化 动态升级
最新内容请见原文:Android 插件化 动态升级 不少朋友私信以及 Android开源交流几个 QQ 群 中都问到这个问题,这里简单介绍下 1.作用 大多数朋友开始接触这个问题是因为 App 爆棚了 ...
- Centos 6.4 python 2.6 升级到 2.7
Centos 6.4 python 2.6 升级到 2.7 分类: Python Linux2013-09-13 21:35 37278人阅读 评论(2) 收藏 举报 一开始有这个需求,是因为用 Ya ...
- CentOS6.5 python 2.6升级到2.7
在CentOS6.5下,将自带的python2.6.6升级到python2.7.3,解决方法如下: 下载python2.7.3包,并解压缩,输入命令:#wget http://python.org/f ...
- python importlib动态导入模块
一般而言,当我们需要某些功能的模块时(无论是内置模块或自定义功能的模块),可以通过import module 或者 from * import module的方式导入,这属于静态导入,很容易理解. 而 ...
- python高级-动态特性(20)
一.动态语⾔的定义 动态语言是在运行时确定数据类型的语言.变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型.现在比较热门的动态语言有:Python.PHP.JavaScript.Obj ...
- Python importlib(动态导入模块)
使用 Python importlib(动态导入模块) 可以将字符串型的模块名导入 示例: import importlib module = 'module name' # 字符串型模块名 test ...
- CentOS 7.0 下 Python 2.7 升级到 Python 3.5
前段因为时间工作需要,要把 Centos 7.0 默认安装的 Python 2.7 升级到 Python 3.5. 具体操作如下: # 安装 gcc gcc-c++ 等编译工具软件 yum insta ...
- 【大话QT之十二】基于CTK Plugin Framework的插件版本号动态升级
应用需求: 某些场景下我们可能面临这种问题,在执行着的应用程序不能终止的情况下,升级某个功能(或添,或减.或改动).在不採用CTK Plugin Framework插件系统架构的情况下这将是非常困难的 ...
随机推荐
- 图解三种APP的区别
- 应用程序无法正常启动0xc0150002 解决方式
我也遇到过此问题,解决的方法: 方案一: 在项目的"属性|配置属性|链接器|常规"中的"启用增量链接"选择"否".此方法阻断了问题产 ...
- 《细说 new与 malloc 的 10 点区别》
http://www.jobbole.com/members/melonstreet/
- 聊聊 KVC 和 KVO 的高阶应用
KVC, KVO 作为一种魔法贯穿日常Cocoa开发,笔者原先是准备写一篇对其的全面总结,可网络上对其的表面介绍已经够多了,除去基本层面的使用,笔者跟大家谈下平常在网络上没有提及的KVC, KVO进阶 ...
- 基于AFNetworking3.0网络封装
概述 对于开发人员来说,学习网络层知识是必备的,任何一款App的开发,都需要到网络请求接口.很多朋友都还在使用原生的NSURLConnection一行一行地写,代码到处是,这样维护起来更困难了. 对于 ...
- XC软件管理器应用
这是一个基于android 4.4开发的android应用-XC软件管理器.包含应用的信息查看,打开应用以及应用的卸载等功能.非常实用的一个应用,欢迎大家下载使用. 下载地址:http://downl ...
- tar命令解压、压缩gz/bz2/xz文件
1.处理.tar.gz 压缩:tar zcf FILE.tar.gz FILEDIR 解压:tar zxf FILE.tar.gz 2.处理.tar.bz2 压缩:tar jcf FILE.tar.b ...
- apache目录及文件讲解
apache目录下bin,conf,htdocs,logs,modules讲解 bin: ab 压力测试工具 apachectl 启动命令 apxs ...
- spring 3.1.4 升 4.0.2
来自为知笔记(Wiz)
- Android 指定日期时间执行任务的Timer
放上一个指定详细日期及时间的timer public class MainActivity extends Activity { private Handler handler = new Handl ...