关于Runtime.getRuntime().exec(cmd);问题,请求大神帮忙解决,昨天一晚上没搞出来

China_Java_zy 2013-01-18 01:44:43
1 需求,利用java程序重启tomcat
2 看程序
package com.idt.common;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;

public class TomcatReset {

public void TomcatShutDown(String Path1){

Runtime runtime = Runtime.getRuntime();

try {
Process process = runtime.exec(Path1);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String s;
boolean restart = false;
while ((s = in.readLine()) != null) {

restart = true;
break;

}
System.out.println("<" + new Date() + "> Tomcat is stop "
+ (restart ? "OK" : "ERROR"));
System.out.println("成功停止服务");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void TomcatStart(String Path2){
Runtime runtime = Runtime.getRuntime();
try {
Process process = runtime.exec(Path2);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String s;
boolean restart = false;
while ((s = in.readLine()) != null) {

restart = true;
break;

}
System.out.println("<" + new Date() + "> Tomcat is start "
+ (restart ? "OK" : "ERROR"));
System.out.println("成功启动服务");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3 path1 是我传的路径="D:\\Tomcat6_dl\\bin\\shutdown.bat"
path2 是我传的路径="D:\\Tomcat6_dl\\bin\\startup.bat"

4 问题:当我执行完Process process = runtime.exec(Path1);这行代码的时候老是将我的MyEclipse本身自带的tomcat 服务关闭了,而我MyEclipse本身自带的服务是E盘下的,我用debug观察我传过来的路径没有错误确实是D盘下的,那为什么老是关闭我MyEclipse本身自带的服务,上网找了很多帖子都不管用,有的帖子是说Runtime.getRuntime().exec(cmd);执行完之后进行了死锁,所以老执行我之前配置的路径,很是郁闷,希望高手帮我解答下,不胜感激

...全文
2262 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
China_Java_zy 2013-01-22
  • 打赏
  • 举报
回复
研究了几天 答案终于被我找出来了 package com.idt.common; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.Date; /** * Java中使用Runtime和Process类运行外部程序 * @author 张阳 * */ public class TomcatReset { public void ControlTomcat(String Path1,String Path2,String str){ Runtime runtime = Runtime.getRuntime(); try { Process process = runtime.exec("cmd /C "+Path2+" "+str,null,new File(Path1)); System.out.println(str+"--TomcatStart()-"); System.out.println(Path1+"--TomcatStart()-"); System.out.println(Path2+"--TomcatStart()-"); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); String s; //String t = "连接成功"; boolean restart = false; while ((s = in.readLine()) != null) { // if (s.indexOf(t) != -1) { restart = true; break; // } } System.out.println("<" + new Date() + "> Tomcat is "+str+" " + (restart ? "OK" : "ERROR")); } catch (IOException e) { e.printStackTrace(); } } }
China_Java_zy 2013-01-18
  • 打赏
  • 举报
回复
@一抹相思寄玉箫 你这眼睛 你看看我截图的路径好不,我说的意思 你给我的 方法 还不关闭不了 D盘 还是关闭E盘的,大姐 你好好看看 好不,再一个 之前我说了runtime.exec这个 方法 只调用运行环境中的变量
  • 打赏
  • 举报
回复
D盘的tomcat开着,Process process = runtime.exec("cmd /c start D:XXX\stutdown.bat");这样关闭不了?你截图明明关闭的是E盘的。
China_Java_zy 2013-01-18
  • 打赏
  • 举报
回复
@robotta @cxm_cxm @一抹相思寄玉箫 1 我的tomcat6 版本是解压版的 2 我的MyEclipse 用的是在E盘下的tomcat,我要去关闭的是D盘下我手动双击打开的.bat披文件处理的tomcat, 3 我要用我的程序去关闭D盘下的手动打开的tomcat 4 E盘下的tomcat 和D盘下的tomcat的端口号 我都改了,如果不改我不可能同时打开两个
神马_浮云 2013-01-18
  • 打赏
  • 举报
回复
你的tomcat和你D盘那个tomcat关闭(shutdown)端口一样,所以会把你的eclipse的关了(直接结束端口),解决办法就是改端口
  • 打赏
  • 举报
回复
你又是打开的D盘的tomcat,去关闭e盘的tomcat,一个tomcat默认的端口就是8080,不修改就不可能打开两个,关闭也不可能。
ro_nice 2013-01-18
  • 打赏
  • 举报
回复
Myeclipse 下的tomcat也是引入进来的吧。所以还是同一个tomcat咯。 如果关不掉,你看启动行么?双击启动.bat文件,如果报错的话,看清楚错误信息
China_Java_zy 2013-01-18
  • 打赏
  • 举报
回复
@一抹相思寄玉箫 你没明白我意思,首先我做的程序是用我写的java代码控制外部的tomcat的打开和关闭,而不是控制我MyEclipse中的tomcat,即一个程序控制另一个程序的服务启动和关闭
  • 打赏
  • 举报
回复
如果是同一个tomcat下的打开和关闭bat文件,不可能关不掉。
China_Java_zy 2013-01-18
  • 打赏
  • 举报
回复
@一抹相思寄玉箫 关不掉,我现在知道问题出在哪了 为什么关不掉 Runtime.getRuntime();这个方法是可以取得当前JVM的运行环境,这也是java唯一得到运行时环境的方法,而我电脑上 现在MyEclipse是一个 运行环境,我又手动打开了一个tomcat服务,它可能只找当前MyEclipse下的运行环境,所以老是关闭MyEclipse的服务,疑问就在我怎么样让他不去找MyEclipse中的运行环境而去找我手动打开的tomcat的服务环境,我只有一个办法那就是 手动把MyEclipse中的shutdown.bat文件里的读取环境改成我要用到的环境路径,但是我昨晚一直认为这不是个好办法,因为我写完的这个功能不可能让现场维护人员认为的去改服务器的.bat文件
  • 打赏
  • 举报
回复
你的意思是什么,是关不掉,还是?我看你不是已经关闭了吗?自己打开任务管理器看tomcat是否已经关闭就行了。
China_Java_zy 2013-01-18
  • 打赏
  • 举报
回复
@一抹相思寄玉箫 我这个是解压版本的
  • 打赏
  • 举报
回复
必须使用解压版的,而不是安装版的。
China_Java_zy 2013-01-18
  • 打赏
  • 举报
回复
@一抹相思寄玉箫
给你截图 我要疯了,我按照你那么写的
China_Java_zy 2013-01-18
  • 打赏
  • 举报
回复
@一抹相思寄玉箫 我是先关闭的,我为了测试 先手动开启D盘下的tomcat 然后用java程序控制它关闭再重启
China_Java_zy 2013-01-18
  • 打赏
  • 举报
回复
@EverWHL 还是很感谢你 给我发的这个,你发的这个 跟我写的程序几乎是完全一样的,没太大出路,我也是将.bat文件写在配置文件里的,然后传进来的,可是我就出现了发帖的那种状况
  • 打赏
  • 举报
回复
先关闭它,Process process = runtime.exec("cmd /c start C:\\apache-tomcat-6.0.35\\bin\\stutdown.bat"); 再打开,你直接手开两个也一闪而过呢。
China_Java_zy 2013-01-18
  • 打赏
  • 举报
回复
Process process = runtime.exec("cmd /c start"+ Path1) 这么写 虽然 不关闭我MyEclipse中的tomcat 了 但是也没有关闭 D盘下的tomcat 而是又弹出来个dos窗口运行服务,而且报错,之后自动关闭了
EverWHL 2013-01-18
  • 打赏
  • 举报
回复
如何用java程序控制Tomcat重启 如何用java程序控制Tomcat重启因为涉及到了用上行控制Tomcat的重启.所以就想到如何用java代码来控制Tomcat重启了. 

因为平时Tomcat在windows上的重启一般都是用vbs或者是.bat脚本来写的.只要做能做到用JAVA调用这两种脚本就可以了.

 在JAVA的API里面.可以用代码控制本地的可执行文件而不能直接调用脚本.因此需要把脚本转换成可执行文件可以下载visualVBS来把vbs脚本转换成.exe.bat转换的脚本更多.网上搜索一下就能找到了. 

之后在线程里面直接调用JAVA API里面的执行代码就可以做到重启TOMCAT了.DEMO: 

首先是重启脚本,写成.vbs 

set WshShell=WScript.CreateObject("WScript.Shell")WshShell.Run("net stop tomcat5")WScript.Sleep(10000)WshShell.Run("net start tomcat5") 

 

 然后用visualVBS转换成.exe文件然后做一个类,重启Tomcat专用

 package com.uf.tool.util;

 /******* Tomcat重启类* @author jiangqinghua**/ 

public class TomcatReset { 

 private String tomcat="";

 public TomcatReset() { 

 Config config=Config.getConfig(); 

 tomcat=config.getProperties("tomcat");

 } 

 public void tomcatRun(){

 try {

 System.out.println("the command is:" tomcat);

 Process child = Runtime.getRuntime().exec(tomcat);

 } catch (Exception e) { 

 e.printStackTrace(); 

 } }}

 其中tomcat就是其存放的绝对路径,因为可能会变,就写在配置文件里面 

 Runtime runtime = Runtime.getRuntime(); 

 Process process = runtime.exec("C:\\Tomcat\\bin\\shutdown.bat"); 

runtime.gc(); 

 BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); 

 String line = null, result = ""; 

 while ((line = input.readLine()) != null) result += line + "\r\n"; input.close(); 

 System.out.println(result);

 process = runtime.exec("C:\\Tomcat\\bin\\shutdown.bat");
 
希望给楼主能有些帮助 http://hi.baidu.com/rungump/item/fdaa50e84711daf5e0a5d491
  • 打赏
  • 举报
回复
 public static void main(String[] args) {  
    	Runtime runtime = Runtime.getRuntime();

    	try {
			Process process = runtime.exec("cmd /c start C:\\apache-tomcat-6.0.35\\bin\\startup.bat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }  
这样应该没有问题吧。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧