前段时间写了一个知识共享的邮件,是关于.net启动加速的方法,其中在方法三中描述了使用了编写一个程序定时访问的方法。那么就有一些小伙伴在这种程序处理的方法上有些疑问,最普遍的就是,如何让它们在远程访问注销、重启之后还能自动运行?当然,大家都知道答案是做成服务即可。但是做成可靠的系统服务却不是那么容易的,通常的情况下,大家都采用以下几种方法:
1, 在网站中部署一个专门执行程序的页面,将需要实现的逻辑代码放到该页面中,然后通过一些脚本语言,访问这个页面(例如写.bat或者.py文件),并将Windows操作系统的“执行计划”=》“创建任务”中运行。此方法的好处在于运行情况受系统管束,可以直观的看到执行的成功情况,且一次出错不影响下次的动作。缺点也非常明显:大动作网页容易超时、脚本容易执行失败且不容易调试、需要选择正确的权限和用户执行、需要配置参数等等。【虽然我最早就是用这种方法做的,但是实在是不推荐使用这个方法,后期维护什么的极容易出问题,交给新人十次有九次出错啊】
2, 专门写一个exe,其中使用定时器或者thread.sleep来控制时间间隔。然后远程登录系统直接执行。此方法的好处在于完全可控、可调试、好维护,定时任务就是项目代码的一部分。缺点也很明显:一旦一不小心注销了,或者重启,那这个任务就完蛋了,无法自动恢复动作。
3, 此方法是2的进阶,直接写成一个服务。好处不多说,坏处是调试和控制过程极其难受,尤其对不习惯调试服务的同事而言,恐怕每次都非常痛苦。
4, 此方法是1和2的合并。也就是写一个专门的exe,然后设置定时任务执行。此方法的问题在于:控制部分是由系统执行,而运行部分是代码执行,如果需要统一协调或者进行统一的程序处理则无法实现了【当然,还要做一堆设置,也是需要选择正确运行的账户啊、权限啊什么的,也挺闹心的】
其实就是三个大类:“定时任务”,“自己写服务”,“远程开一个程序”。各有利弊吧,大家可以选择性使用。
而最近我这里使用的方法是这样的【和方法二类似】:
编写一个EXE,使用定时器或者thread.sleep来控制时间间隔。然后使用“instsrv.exe”和“srvany.exe”构建系统服务。好处在于其实就是相当于系统有个服务帮我看着这个exe运行,至于exe内部运行成什么样子完全是由exe自己决定的;而且不用做那么多设置,更新或者重置的话操作也很简单【主要是为了傻瓜化处理服务程序】。扩展功能或者多次部署什么的都非常容易【直接代码中写就好了,不行的话再开个服务即可】
具体操作过程如下:
一,构建服务过程
1,将附件解压出的文件拷贝到要设置成Windows服务的文件目录下
2,用记事本打开Service_install.bat,修改其中的
set ServiceName=服务名称【将在系统的“服务”列表中出现】
set ExeName=程序名称【希望做成服务的程序名称,最好带上.exe后缀】
3,使用管理员权限运行Service_install.bat即可
二,删除服务过程
1,用记事本打开Service_install.bat,修改其中的
set ServiceName=服务名称【在系统的“服务”列表中出现的名称】
2,使用管理员权限运行Service_del.bat即可
完全傻瓜化处理,简单方便。SVN地址:下 目录:简单构造Windows服务
PS:需要注意的是,如果是做成exe的程序,必须使用无界面的“控制台程序”,并且要做好容错和运行Log。