基于Delphi的定时重启特定服务的程序设计与实现

2019-06-01 10:06许丽光翁花群曾福山
电脑知识与技术 2019年12期

许丽光 翁花群 曾福山

摘要:设计一个基于Delphi编译环境的定时重启特定服务的程序,并经实际应用环境反复实验测试,证实能够很好地解决由于Tomcat运行环境异常错误大量累积后,造成内存致命错误,无法提供正常访问服务等诸如此类问题。

关键词:Delphi编译;Apache服务;Tomcat;内存溢出错误;批处理命令

中图分类号:TP319 文献标识码:A

文章编号:1009-3044(2019)12-0284-03

开放科学(资源服务)标识码(OSID):

Delphi-based Design and Implementation of Scheduled Service-Restarting Program

XU Li-guang, WENG Hua-qun, ZENG Fu-shan

(Informatization Construction and Management Center, Putian University, Putian 351100, China)

Abstract: A Delphi-based scheduled service-restarting program has been designed and repeatedly tested in the actual application environment, which proves that it can solve such problems as failure to get access to services due to fatal memory error resulting from large accumulation of abnormal errors in the Tomcat runtime environment.

Key words: Delphi compilation; Apache service; Tomcat; Out-Of-Memory Error; batch command

1 背景

在日常信息化运维工作中经常遇到某个程序在运行一段时间后出现异常,需要重启服务。例如Tomcat运行环境在运行一段时间后,由于大量用户同时访问Apache服务器而对服务器内存的影响,异常错误大量累积后,造成内存致命错误,出现“OutOfMemoryError”提示,导致Apache服务异常,无法提供正常访问服务。此时,往往需要重启Apache服务,重新初始化Tomcat运行环境,以使Apache服务恢复正常。在这种情况下,如果手动进行相关服务重启操作,对于信息化运维工作人员而言,常常不胜其烦,很大程度上增加了信息化日常运维工作量;而且由于异常情况的出现无法提前预知,错误总是不定期出现,运维人员很难都做到及时处理,影响了工作效率和成效,如此反复,给所服务的对象用户带来极差的服务体验。为了有效解决上述问题,本文设计了一个基于Delphi编译环境的定时重启该特定服务的程序,经实际应用环境多次实验测试,该程序能够很好地解决此类问题。

2 重启Tomcat运行环境的初始化批处理代码解析

实现初始化Tomcat运行环境过程的批处理(startup.bat)部分内容解析如下:

@echo off

if "%OS%" == "Windows_NT" setlocal //检测操作系统环境变量。

……

:okExec

set CMD_LINE_ARGS= //清除CMD_LINE_ARGS环境变量原值。

:setArgs

if ""%1""=="""" goto doneSetArgs //若參数%1为空则执行doneSetArgs段,表示已接传入的参数。

set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 //给 CMD_LINE_ARGS 添加参数%1,以空格分隔。

Shift //截除原参数,使参数%1成为原参数。

// 上述代码是将所有参数用空格分隔开,并给CMD_LINE_ARGS赋值。

goto setArgs

:doneSetArgs

call "%EXECUTABLE%" start %CMD_LINE_ARGS%

//运行新窗口,重启执行 EXECUTABLE 环境变量所示的catalina.bat 程序及 CMD_LINE_ARGS 所含的参数。

:end //初始化结束。[1]

3 程序设计思路

利用可视化编程开发工具Delphi 2010的Timer时间组件每隔1秒通过API函数获取系统时间,并把时间字符串与所设定的定时启动时间比对,满足条件即调用API函数ShellExecute执行特定服务或程序,本文实际应用于重启上述初始化Tomcat运行环境的批处理程序(startup.bat)。

关键函数ShellExecute原型如下[2](须引用ShellAPI .pas单元,即uses ShellAPI;):

function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST;

若ShellExecute函数执行成功,则返回被执行程序的实例句柄。若返回值低于32,则表示执行存在错误。

4 程序流程图(如图1)

程序流程:启动运行程序后,待用户在时间输入框中按照提示的时间格式设定好定时启动运行的时间规则内容,以及在程序输入框中浏览或指定需执行的程序的完整路径和文件名,然后点击启动按钮,启动按钮切换为停止按钮,定时器开始持续获取系统时间,每秒比对系统时钟是否满足设定好的启动时间,满足条件则立即执行指定程序,否则定时器继续获取系统时间,进行下一秒比对,当用户点击停止按钮,则程序停止运行,关闭后结束运行。

5 程序实现(主要模块代码)

5.1 初始化运行界面模块

本模块代码用于实现程序运行界面窗体内容初始化显示,提示定时时间设定的格式规则,并提取时间输入范例,方便用户直接进行修改。

procedure TForm_Exe.FormShow(Sender: TObject);

begin

Label_Time.Caption:='执行时刻设定(格式:'+DateTimeToStr(Now)+')'; [3]

Edit_SetTime.Text:=Copy(DateTimeToStr(Now),Length(DateTimeToStr(Now))-7);

Edit_SetTime.SetFocus;

end;

5.2 “启动”按钮和“停止”按钮切换模块

本模块代码用于实现程序 “启动”功能按钮和“停止”功能按钮交替切换,达到程序交互界面简洁友好的目的。

procedure TForm_Exe.Button_ExecuteClick(Sender: TObject);

begin

if Button_Execute.Caption='启动' then

begin

Timer_Now.Enabled:=True;

Edit_SetTime.ReadOnly:=True;

Button_Execute.Caption:='停止';

end

else

begin

Timer_Now.Enabled:=False;

Edit_SetTime.ReadOnly:=False;

Button_Execute.Caption:='启动';

Label_Time.Caption:='执行时刻设定(格式:'+DateTimeToStr(Now)+')';

end

end;

5.3 浏览并提取指定程序的完整路径和文件名模块

本模块代码用于实现“浏览”按钮功能,获得所指定执行程序完整的路径和文件名。

procedure TForm_Exe.Button_LoadClick(Sender: TObject);

begin

if OpenDialog_ExeFile.Execute then Edit_ExeFileName.Text:=(OpenDialog_ExeFile.FileName); [4]

end;

5.4 Timer组件主程序模块

本模块代码用于实现由Timer定时器每秒获取系统时钟,判断系统时钟是否包含设定好的启动时间,满足条件则继续执行并打开指定程序,若所指定的执行文件不存在,则给出确认文件是否存在的提示信息。

procedure TForm_Exe.Timer_NowTimer(Sender: TObject);

begin

Label_Time.Caption:='現在时刻:'+DateTimeToStr(Now);

if Pos(Edit_SetTime.Text,Label_Time.Caption)<=0 then Exit;

ExeFile:=Edit_ExeFileName.Text;

if (FileExists(ExeFile)) then

ShellExecute(Handle,nil,PWideChar(ExeFile),nil,nil,SW_NORMAL)

else

messagebox(0,PWideChar(' 请确认文件 ('+ExeFile+') 是否存在! '),'请确认...',MB_OK);

end;

6 程序运行界面设计[5](如图2)

程序运行界面设计遵循了界面友好的重要原则,兼顾简洁和美观,窗口标题栏和界面标题体现程序所实现的功能,交互输入框内容格式提示和功能按钮含义清晰明了,能够直观地引导用户上手使用。

7 程序运行效果

如上例图2所示,假设程序重启时间设定为3:59:59,当系统时钟满足所设定的时间字符串,则立即执行所指定的Tomcat运行环境的初始化批处理程序startup.bat。由于系统时钟为24小时格式,故每天满足所设定的时间共有三次,分别为03:59:59、13:59:59、23:59:59,如此可以自动在Tomcat运行环境出现异常前定时恢复初始化环境状态,保持Apache服务处于良好运行状态。

8 结束语

定时重启特定服务的程序不仅可以使需重启的服务每天有多个时段进行重新执行,还可以指定某天某个时刻执行特定程序或服务,能够有效满足程序自动运行的需求,使各类服务保持良好运行状态。

定时重启特定服务的程序后续有待从多个方面对程序代码进一步改良和完善,以满足不同的需求。如根据需要对设定的时间按日期设定递增值,并可设定日期递增的间隔长度;此外,考虑在程序实现中调用进程结束命令,以便使得特定服务重启前先结束内存中的进程运行,释放内存空间,避免程序重复运行,占用多余的内存,使用taskkill结束进程的命令是一个可行的方法之一。taskkill /f /im explorer.exe范例释义:taskkill是批处理中常用的结束进程的命令,/f和/im都是参数,前者表示强制结束,后者表示结束进程用程序名显示,如explorer.exe。[6]

参考文献:

[1] 解读tomcat 的startup.bat内容[EB/OL]. [2013-07-24]. https://zhidao.baidu.com/question/573218387.html.

[2] Delphi中ShellExecute使用详解[EB/OL]. [2017-04-19]. https://www.cnblogs.com/bestlove/p/6734973.html.

[3] 陈灿煌. Delphi 6彻底研究[M]. 北京: 中国铁道出版社, 2002.

[4] 明日科技. Delphi开发技术大全[M]. 北京: 人民邮电出版社, 2007.

[5] 求实科技. Delphi 7程序设计与开发技术大全[M]. 北京: 人民邮电出版社, 2004.

[6] 自动结束某个指定进程[EB/OL]. [2017-06-22]. https://zhidao.baidu.com/question/2271658977384051068.html.

【通联编辑:谢媛媛】