Asp.net控制Tomcat启动关闭的实现方法
一、场景 
近日有个项目客户要求能自己配置相关权限。由于历史原因这个项目采用的是公司以前的权限系统。这个权限系统很强大,不过有个弊端,就是每增加一个权限菜单都要重启才能生效,不然就要等1天它缓存过期后才生效。由于项目进度我们不可能将这个权限系统推翻重来。 
  可行的方式是在管理员操作界面上增加权限系统重启按钮。这样客户在修改权限后可以很方便的重启Tomcat。 
二、技术分析 
由于管理员系统是基于.net的BS方式。所以我们要能通过网页控制Tomcat的关闭启动,并加载进管理员系统中。 
  首先分析Tomcat的启动方式。在Tomcat6.0的bin目录下有两个批处理文件。startup.bat和shutdown.bat分别控制着Tomcat的启动和关闭。我们要控制Tomcat的启动关闭就得调用这两个批处理文件。 
怎么调呢?在哪调呢?浏览器直接调那是不可能的。必须得在web服务器上部署个web页面,在服务端调用这两个命令。如果部署在权限系统内部那是最好的,不过这会产生一个问题,我们可以关闭Tomcat,但却无法启动。最终的方案是在同一台机子上部署个.net实现的webservice,通过这个webservice实现权限系统的启动和关闭。
三、具体实现 
  在VS2008中创建一个web service项目。 
  创建两个WebMethod。 
  1.启动Tomcat方法
/// <summary> 
/// 启动权限系统 
/// </summary> 
/// <returns>true:成功;false:失败</returns> 
[WebMethod] 
public bool StartPM() 
{ 
try 
{ 
// 创建进程启动信息 
ProcessStartInfo sinfo = new ProcessStartInfo(AppDomain.CurrentDomain.BaseDirectory + "start.bat"); 
// 获取系统环境变量 
IDictionary dics = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine); 
foreach (string key in dics.Keys) 
{// 将系统环境变量加入新进程环境变量中 
if (sinfo.EnvironmentVariables.ContainsKey(key)) continue; 
sinfo.EnvironmentVariables.Add(key, dics[key].ToString()); 
} 
// 不需要从系统外壳程序创建,直接从文件创建 
sinfo.UseShellExecute = false; 
Process.Start(sinfo); 
} 
catch (Exception ex) 
{ 
//TODO: 写日志 
return false; 
} 
return true; 
}
关闭Tomcat方法
/// <summary> 
/// 关闭权限系统 
/// </summary> 
/// <returns>true:成功;false:失败</returns> 
[WebMethod] 
public bool StopPM() 
{ 
try 
{ 
// 创建进程启动信息 
ProcessStartInfo sinfo = new ProcessStartInfo(AppDomain.CurrentDomain.BaseDirectory + "stop.bat"); 
// 获取系统环境变量 
IDictionary dics = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine); 
foreach (string key in dics.Keys) 
{// 将系统环境变量加入新进程环境变量中 
if (sinfo.EnvironmentVariables.ContainsKey(key)) continue; 
sinfo.EnvironmentVariables.Add(key, dics[key].ToString()); 
} 
// 不需要从系统外壳程序创建,直接从文件创建 
sinfo.UseShellExecute = false; 
Process.Start(sinfo); 
} 
catch (Exception ex) 
{ 
//TODO: 写日志 
return false; 
} 
return true; 
}
为了方便以后配置我有新建了两个bat文件。在这两个文件中分别做调用Tomcat的startup.bat和shutdown.bat的操作。具体如下: 
  1.start.bat  
K:\apache-tomcat-6.0.30\bin\startup.bat
2.stop.bat
K:\apache-tomcat-6.0.30\bin\shutdown.bat
四、总结 
  整个开发过程中出现了无法找到CATALINA_HOME、JAVA_HOME环境变量的错误,那是因为父进程也就是web service的环境变量中并没有这两项,所以创建子进程时(子进程的环境变量继承于父进程)也没有这两项。只得从系统环境变量中获取环境变量重新添加进新启动的进程中。同时必须明确的是进程的工作目录不等于进程的启动目录。比如
ProcessStartInfo sinfo = new ProcessStartInfo(AppDomain.CurrentDomain.BaseDirectory + "stop.bat");
如果去掉AppDomain.CurrentDomain.BaseDirectory将报无法找到stop.bat 的错误,就是因为工作目录和启动目录不一致导致。
Asp.net控制Tomcat启动关闭的实现方法的更多相关文章
- Tomcat启动失败的解决方法
		
在使用Tomcat的时候,经常会遇到启动失败的问题:解决方法:1.检查环境变量的配置,jdk的配置2.检查端口是否被占用. 关于环境变量的配置很容易搜到,如果按照网上的教程配置好了,但是还是启动失败的 ...
 - 关于form表单提交到Servlet的时候出现tomcat启动错误的解决方法
		
1.遇到的问题 今天在写jsp代码的时候通过form表单提交到Servlet的时候出现的tomcat启动错误,琢磨了半天,终于找到了解决方法. 解决问题的关键就在于xml配置的路径和servlet中默 ...
 - tomcat 启动 关闭 重启脚本
		
启动 #!/bin/bash # Author:wanglan # Mail:@qq.com # Fuction:Tomcat Start/stop/restart script # Version: ...
 - Linux下Tomcat启动关闭命令
		
1.首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 2.查看Tomcat是否以关闭 ps -ef|grep tomcat 如果显示以下信息,说明Tomcat还没 ...
 - Tomcat启动中文乱码解决方法
		
一:解决方法一: 1.查看电脑系统的编码 针对Windows平台下,点击运行--输入cmd,enter键进入命令窗口,输入:chcp可以得到操作系统的代码页信息(代码页:字符集编码的别名),可以从控制 ...
 - tomcat 启动闪退解决方法
		
当我们在windows上面进行项目的部署与启动的时候有的时候tomcat在进行启动的时候会删一下就退了,这个时候一般是里面启动的时候设置的jdk的问题下面咱们来看一下具体解决方案 编辑我们的start ...
 - Tomcat启动就执行特定方法
		
import java.util.Timer; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContex ...
 - tomcat启动完成执行 某个方法 定时任务(Spring)
		
第一步引入接口: ServletContextListener @RestController @RequestMapping("/schedule") public class ...
 - CentOS7.4 系统下 Tomcat 启动慢解决方法
		
CentOS7.4 系统下 Tomcat 启动慢解决的方法 首先查看日志信息,查看因为什么而启动慢 在CentOS7启动Tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是s ...
 
随机推荐
- C Python类型互换
			
从Python到C的转换用PyArg_Parse*系列函数,int PyArg_ParseTuple():把Python传过来的参数转为C:int PyArg_ParseTupleAndKeyword ...
 - odoo8.0下selection_add的使用
			
在odoo中有selection类型的字段,用于限定字段的值在某些范围之内,在view上面显示此字段时,会显示一个下拉的列表. 如果是自己新定义的字段,这个列表的内容可以自己定义,但如果是继承自某个对 ...
 - java String->float,float->int
			
类型转换代码 : String sourceStr = "0.0"; String类型 float sourceF = Float.valueOf(sourceStr); floa ...
 - Java基础——线程总结
			
Java基础--线程总结 一.线程是什么? 线程:一个程序里不同的运行路径. 二.怎样创建线程? 两种方法创建线程: 第一种 (1)定义详细功能类实现Runnable接口,能够多次调用而实现数据共享 ...
 - 两周赚100万 在Google Play做对了什么
			
http://tech.it168.com/a2013/0301/1457/000001457913_all.shtml
 - C# 遍历Dictionary并修改其中的Value
			
C#的Dictionary类型的值,知道key后,value可以修改吗?答案是肯定能修改的.我在遍历的过程中可以修改Value吗?答案是也是肯定能修改的,但是不能用For each循环.否则会报以下的 ...
 - python-创建一个本地txt文本
			
def text_create(name, msg): desktop_path = '/Users/Hou/Desktop/' full_path = desktop_path + name + ' ...
 - Lintcode---二叉树的最大深度
			
给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的距离. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵如下的二叉树: 1 / \ 2 3 / \ 4 5 这个二叉树的 ...
 - 自己定义进度条PictureProgressBar——从开发到开源公布全过程
			
自己定义进度条PictureProgressBar--从开发到开源公布全过程 出处: 炎之铠邮箱:yanzhikai_yjk@qq.com 本文原创.转载请注明本出处! 本项目JCenter地址:ht ...
 - HTTPS证书申请相关笔记
			
申请免费的HTTPS证书相关资料 参考资料: HTTPS 检测 苹果ATS检测 什么是ECC证书? 渠道2: Let's Encrypt 优点 缺点 Let's Encrypt 的是否支持非80,44 ...