一. 前言

  有了上一篇的“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. C#使用seleium实现一个自动登录器

    1.http://docs.seleniumhq.org/ 下载seleium包 2.新建一个C#项目,比如控制台,引用seleium包中的dll using System; using System ...

  2. 上传图片预览,支持IE6

    //说明:图片上传预览插件 //上传的时候可以生成固定宽高范围内的等比例缩放图 //参数设置: //width 存放图片固定大小容器的宽 //height 存放图片固定大小容器的高 //imgDiv ...

  3. JavaScript当中的eval函数

    eval函数 eval函数接收一个由JavaScript语句组成的字符串,并且返回字符串中最后一条语句的返回值,如果最后一条语句没有返回值,那么eval函数返回undefined.如果传递给eval函 ...

  4. linux下python多版本共存

    为何要安装python,linux下不是已经集成了python吗? 大多数linux系统都集成了python,但是他们的版本太低了.不能满足我们的需求,尤其是好多系统居然仍停留在 python2.6. ...

  5. PHP 获取客户端IP

    function get_ip() { static $realIP; if (isset($_SERVER)){ if (isset($_SERVER["HTTP_X_FORWARDED_ ...

  6. 从客户端(******)中检测到有潜在危险的 Request.Form 值。

    在 提交表单时候,asp.net 提示:"从客户端(......)中检测到有潜在危险的 Request.Form 值" .asp.net中的请求验证特性提供了某一等级的保护措施防止 ...

  7. Linux下find与grep指令的相关用法

    find命令 find命令的一般形式 find命令的常用选项及实例 find与xargs grep命令 grep命令的一般形式 grep正则表达式元字符集(基本集) grep命令的常用选项及实例 1. ...

  8. 关于《s3c2416裸跑环境配置》一文的一些补充

    <s3c2416裸跑环境配置>一文已经发表很长一段时间了,前两天突然收到邮件提示有人回复,原来网友jxyggg按照文中所讲去调试,却始终不能成功.问题的描述见原文后的回复,经过QQ交流,问 ...

  9. 8051、ARM和DSP指令周期的测试与分析

    在实时嵌入式控制系统中,指令周期对系统的性能有至关重要的影响.介绍几种最常用的微控制器的工作机制,采用一段循环语句对这几种微控制器的指令周期进行测试,并进行分析比较.分析结论对系统控制器的选择有一定的 ...

  10. SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现

    原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft ...