一. 前言

  有了上一篇的“python初学”的基础,咱们就有了python的开发包,有了开发环境IDE,那我们就可以干活了。我的第一个选题就是让我们的windows服务可以按照我们的意愿进行自动重启。

  再说一下现在面临的问题吧,我们公司的平台服务是是基于windows服务开发,那如果我想做更新时,就要有如下的步骤:

  1. 停止正在运行的win服务。

  2. 复制指定文件夹下的DLL,粘贴到目标路径。

  3. 删除日志(便于查看启动日志,当然删不删由你)

  4. 重启服务。

  步骤很简单,不过如果每次都这样进行手工操作的话,那是不是有点笨拙了呢,用咱们软件开发原则的话说:don't repeat yourself。

  不过我也是新手,有不对的地方,还请大家指教啊,那我们现在就开始:

二.新建项目

  找了半天,没有找到新建项目的快捷键,不过可以使用alt+F,再加下箭头回车,一样可以,当然也可以自定义shortkey.我只装了一个python3.3,python可以同时允许我们安装多个版本的python,具体项目选择哪个,可以在这里选择。回车,项目就创建完了。

三. 新建python文件

  快捷键:alt+insert 允许我们新建一个Directory,Python Package,但咱这个没那么大,一个python File 就足够了。

  至于名字我也不纠结了,还是与项目名一样吧,

  后面那个__autthor是IDE给我自动生成的,你可以配置一下,让它自动给生成什么,位置见下图:

  

  我看到很多人都在这里设置了字符编码,不过目前我还没有遇到过相关的问题,以后再说吧。

四。开始coding

  在正式coding之前,我们先前分析一下,这个程序的运行过程:

  1. 判断一下,要拷贝的文件是否存在,不存在就什么都不用做了。

  2. 判断指定服务是否正在运行。(如果没有运行,还就简单了),如果运行,那就停掉它。

  3. 判断一下,日志文件是否存在,如存在,就删除它。

  4. copy DLL 文件到指定目录。

  5. 启动服务。

  好了,思路有了,开始编码吧,直接上代码:

  1. 判断一下,要拷贝的文件是否存在,不存在就什么都不用做了。初学python的要注意缩进,python是用缩进划定方法,类,甚至是if,else的作用域的。

import os
src = "C:\\CTIL\\dblogic\\dbLogic.dll"
if not os.path.exists(src):
exit()

  2. 判断指定服务是否正在运行。(如果没有运行,还就简单了),如果运行,那就停掉它。

    这里我定义一个方法,主程序直接调用它就行了。这里插一句,好像写python的人变量和方法,文件名,都习惯用小写。

def stopservice(name):
result = os.popen("sc query %s" % name).read()
if "RUNNING" in result:
logger.info("The Service %s is running........" % name)
os.popen("sc stop %s" % name).read()
logger.info("Stop Service ........")
time.sleep(60)
elif "START_PENDING" in result:
logger.info("The Service %s is starting........" % name)
time.sleep(10)
os.popen("sc stop %s" % name).read()
logger.info("Stop Service ........")
time.sleep(10)
elif "STOP_PENDING" in result:
logger.info("The Service %s is stopping........" % name)
time.sleep(10)
elif "STOPPED" in result:
logger.info("The Service %s stopped........" % name)
else:
logger.info("The Service %s is in other status........" % name)

  这里写的有点啰嗦,主要是写告诉大家,服务运行过程可能有多个状态,咱们最好还是考虑全一些。这里呢,我加了日志记录功能,以后有机会再和大家分享关于python日志方面的东东,这里还有一个方法,time.sleep(10),聪明的你一定知道它是什么意思了,这里不多说了。

  

  3. 判断一下,日志文件是否存在,如存在,就删除它。直接上方法

def deleteFile(filepath):
if os.path.isfile(filepath):
try:
os.remove(filepath)
except:
print("delete File failure: %s" % filepath)
elif os.path.isdir(filepath):
for item in os.listdir(filepath):
itemsrc = os.path.join(filepath, item)
deleteFile(itemsrc)
try:
os.rmdir(filepath)
except:
print("delete Folder failure: %s" % filepath)

  这里有点小说明,就是这个deletefile方法的接收参数既可以是文件,也可以是文件夹,删除呢也是采用两种方式。还里还有一个小的异常处理,有点小特别吧。

  4. copy DLL 文件到指定目录。

    这个也是比较简单:

shutil.copyfile(src, target)

  5. 启动服务。

def startservice(name):
logger.info("The Service %s is starting....... " % name)
os.popen("sc start %s" % name).read()
time.sleep(60)
result = os.popen("sc query %s" % name).read()
if "RUNNING" in result:
logger.info("The Service started Succesivlly")

五. 部署

  代码写完了,调试几个,就可以运行了,那么如何把它放在服务器上运行呢,一开始我想是不是也要打个包什么的呢,也找了些工具,不过后来,我想这么小的东西,还是直接放上去得了,大不了安装一下python。

六. 结语

  我的第一个Python项目就完成了,没有把完整代码发出来,是想让大家都亲手都实践一下。

  欢迎大家讨论。

Python-windows服务-重启自动化的更多相关文章

  1. windows中实现python,redis服务自动重启(任务计划程序+bat脚本)

    需求:银行电脑无法自动开机,只能 通过 应用相关服务每天自动重启的方式实现 服务更新并且防止服务假死,内存过大 等情况 相关工具:win10系统中,使用windows自带的任务计划程序 和 bat脚本 ...

  2. 【python】使用python写windows服务

    背景 运维windows服务器的同学都知道,windows服务器进行批量管理的时候非常麻烦,没有比较顺手的工具,虽然saltstack和ansible都能够支持windows操作,但是使用起来总感觉不 ...

  3. python管理Windows服务

    上一篇介绍了pywin32模块,它的win32service子模块提供了对服务管理API的包装,相关API如下: ChangeServiceConfig ChangeServiceConfig2 Cl ...

  4. 监控windows服务,当服务停止后自动重启服务

    近期花时间研究了一下windows和linux下某服务停了后自动重启的功能,在网上收集了些资料,并经过测试,在此整理一下.这里介绍的是windows服务的监控,是通过批处理来实现的.本例是监控wind ...

  5. C# 代码重启windows服务

    ServiceController service = new ServiceController("EnergyRecordService"); protected void b ...

  6. 通过C#来开启、关闭、重启Windows服务

    通过C#开启服务需要这个C#程序有相应权限,比如服务的账户是Local System的就必须以管理员权限运行C#程序才能开启或关闭. 这里只写重启的方式(就是先关闭,后开启): // Security ...

  7. python实现编写windows服务

    使用python编写windows服务 最近测试服务器上经常发生磁盘空间不足,每次手动清除比较麻烦,所以写个windows服务定时清理下.中间也遇到过几个坑,一起记录下来. 1.python实现win ...

  8. Python做windows服务

    Python做windows服务(多进程服务),并结束多进程 Python中_,__,__xx__的区别 在注册MyWinService服务时,再使用 "sc delete 服务器名称&qu ...

  9. 一次使用Python连接数据库生成二维码并安装为windows服务的工作任务

    最近有一个需求,在现有生产系统上的人员库中增加一个此人员关键信息的二维码,支持文字版和跳转版两种方式,与报表工具关联,可打印.以windows服务方式,定时检查,只要发现某人员没有此二维码信息,就生成 ...

随机推荐

  1. JS如何判断IE和火狐与Chrome浏览器

    var isIE=navigator.userAgent.toUpperCase().indexOf("MSIE")?true:false; 类似的可以写var isFirefox ...

  2. RSA加密算法及其与SpringMVC集成

    如有不足,敬请各位提出批评,定会改正.THX! 本文介绍的是RSA加密算法+Spring Security在SpringMVC中的集成使用. Spring Security是什么? 引用: Sprin ...

  3. ArcEngine 添加字段

    private void AddField(IFeatureClass pFeatureClass, string name, string aliasName, esriFieldType Fiel ...

  4. 更新Android SDK 出错 Failed to rename directory \temp\ToolPackage.old01

    打算更新Android SDK 版本到 Android SDK Tools 20,打开SDK Manager.exe 开始更新,结果安装时弹出错误提示:Failed to rename directo ...

  5. django防止表单数据重复提交

    思路:      在Asp.net中存在Page.IsPostback的方法,所以对django中表单提交数据的重复提交的数据采用相似方法实现,即在页面第一次访问时,即访问方法为GET方法在view中 ...

  6. CSS 规划

    1)在拿到psd效果图后,我会将所有的效果图看一遍,然后开始打草稿,在纸上画,在PS中标注都可以.一般都是做个大概的统计,太详细不太现实,既费时间也费精力. 2)网站的浏览器兼容性要顾及到哪些,IE6 ...

  7. CDZSC_2015寒假新人(2)——数学 A

    A - A Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  8. (原+转)Ubuntu下安装understand及在启动器中增加快捷方式

    参考网址: http://www.xuebuyuan.com/1353431.html http://www.2cto.com/os/201309/242543.html http://my.osch ...

  9. ubuntu安装配置gradle

    在Ubuntu安装Gradle也是很简单.切记请勿使用apt-get安装Gradle.因为Ubuntu源的Gradle实在太旧.安装好基本不能用. 下面是安装步骤: 1.在官网下载最新的Gradle版 ...

  10. centos 6.5 安装 redis

    下载软件: wget wget http://download.redis.io/releases/redis-2.8.7.tar.gz 2.解压软件并编译安装: tar -zxvf redis-2. ...