标签:rtu last get index 粘贴 at命令 标准 版本 replace
1、Windows下 java执行cmd 命令无法关闭tomcat
cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && shutdown.bat
2、解决思路:
a:想象一下自己在Windows下如何结束进程
b: 首先你得知道程序的端口号 tomcat 我这默认为:80
cmd /c netstat -a -n -o | findstr :80 --> 根据 端口号找到 pid
c: 当你找到pid 后就干掉它:
d:java 应该如和实现 ?
3、思路已有代码时刻:
package updateDepot;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.impl.execchain.MainClientExec;
/**
* @author wzy
* @version 创建时间:2020年1月7日 下午4:18:47
* 类说明
*/
public class testTomcat {
//储存 端口号
private Set ports;//在类名下方定义一个变量
public static void main(String[] args) {
//cmd /k d: && cd d:/Run/Tomcat/bin && startup.bat
// String command = "D:/WindowsETC/ETC_Managent/apache-tomcat/bin/startup.bat";//启动tomcat命令
// String command = "cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && startup.bat";//启动tomcat命令
// String command = "rd /s /q D:\\WindowsETC\\ETC_Managent\\apache-tomcat\\work\\Catalina";//启动tomcat命令
/*Runtime.getRuntime().exec("cmd1 && " +"cmd2 && " +"cmd3 && " );*/
// String command = "java -version";
//String command = "E:\\apache-tomcat-7.0.76\\bin\\tomcat7w.exe";//启动Tomcat命令,仅限windows版本,无弹框
// String command = "taskkill /f /t /im java.exe";//关闭tomcat命令
// String command = "D:\\WindowsETC\\ETC_Managent\\apache-tomcat\\bin\\shutdown.bat";//关闭tomcat命令
// String command = "cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && shutdown.bat";//关闭tomcat命令
// String command = "cmd /c D: && cd D:\\WindowsETC/ETC_Managent/apache-tomcat/bin && shutdown.bat";//关闭tomcat命令
String command = "cmd /c netstat -a -n -o | findstr :80";//关闭tomcat命令
// testTomcat callTomcat = new testTomcat();
//
// try {
//
// callTomcat.callCommand(command);
//
// } catch (IOException e) {
//
// System.out.println("执行命令时出错:" + e.getMessage());
//
// }
testTomcat callTomcat = new testTomcat();
String port[]={"80"};
killPort(port);
// callTomcat.killPort(port);
}
// cmd 执行命令
public void callCommand(String command) throws IOException {
Runtime runtime = Runtime.getRuntime();//返回与当前的Java应用相关的运行时对象
//指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例
Process process = runtime.exec(command);
runtime.gc();//运行垃圾回收器
String line = null;
String content = "";
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
while((line = br.readLine()) != null) {
content += line + "\r\n";
System.out.println(line);
}
// System.out.println(content);
}
//根据 端口号进行查找
public void start(int port){
Runtime runtime = Runtime.getRuntime();
try {
//查找进程号
Process p = runtime.exec("cmd /c netstat -ano | findstr \""+port+"\"");
InputStream inputStream = p.getInputStream();
List read = read(inputStream, "UTF-8");
if(read.size() == 0){
System.out.println("找不到该端口的进程");
try {
Thread.sleep(6000);
System.exit(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
for (String string : read) {
System.out.println(string);
}
System.out.println("找到"+read.size()+"个进程,正在准备清理");
kill(read);
}
} catch (IOException e) {
e.printStackTrace();
}
}
//读取 java执行cmd 命令返回的 结果 只是 干掉 pid使用
private List read(InputStream in,String charset) throws IOException{
List data = new ArrayList();
BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset));
String line;
while((line = reader.readLine()) != null){
boolean validPort = validPort(line);
if(validPort){
data.add(line);
}
}
reader.close();
return data;
}
//判断 端口号是否存在
private boolean validPort(String str){
Pattern pattern = Pattern.compile("^ *[a-zA-Z]+ +\\S+");
Matcher matcher = pattern.matcher(str);
matcher.find();
String find = matcher.group();
int spstart = find.lastIndexOf(":");
find = find.substring(spstart + 1);
int port = 0;
try {
port = Integer.parseInt(find);
} catch (NumberFormatException e) {
System.out.println("查找到错误的端口:" + find);
return false;
}
if(this.ports.contains(port)){
return true;
}else{
return false;
}
}
//具体执行 干掉进程方法
public void kill(List data) {
Set pids = new HashSet();
for (String line : data) {
int offset = line.lastIndexOf(" ");
String spid = line.substring(offset);
spid = spid.replaceAll(" ", "");
int pid = 0;
try {
pid = Integer.parseInt(spid);
System.out.println(pid);
// taskkill /pid 2044 -t -f
//结束xxxx进程 pid 为 查询出的 pid
callCommand("taskkill /pid "+pid+" -t -f");
} catch (NumberFormatException e) {
System.out.println("获取的进程号错误:" + spid);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
pids.add(pid);
}
}
//方法入口
public static void killPort(String[] _ports) {
Set ports = new HashSet();
for (String spid : _ports) {
try {
int pid = Integer.parseInt(spid);
ports.add(pid);
} catch (Exception e) {
System.out.println("错误的端口号,请输入一个或者多个端口,以英文逗号隔开");
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
//machNetSetDaoImp 表示当前的类名
testTomcat kill = new testTomcat();
kill.ports = ports;
System.out.println("need kill " + ports.size() + " num");
for (Integer pid : ports) {
kill.start(pid);
}
System.out.println("清理完毕,程序即将退出");
System.out.println("SUCCESS");
}
}
结果:
为啥搞这个。。。。。。。辛酸泪啊。。。。
我们公司 用servlet 写的后台+jsp 页面 + tomcat 分为 Windows /redhat /Ubuntu 其中{Windows 分为 win7 win10 Windows server 真恶心}
涉及到 后续的 版本更新维护 搞得升级程序用的一个jar包 思路很明显。
1、对比版本号
2、替换war包
3、是否替换成功,成功好,启动
ok看似非常简单没啥难度的。。。。。
好的先写 linux的 非常轻松。
当写Windows 好您要的坑已经 准备完毕 真酸爽!
当你启动 startup.bat {cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && startup.bat} 时非常舒服 没啥
但是shutdown.bat 时问题来了 各种报错。说你xxx 没有释放xxx 没有关闭。
试验了很久 各方百度 "cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && shutdown.bat“ ------> 这个破命令 坑死我了 (曾有人说过 实践才是检验真理的唯一标准,有些 帖子试都没试 直接从别人哪里 粘贴复制 根本没用,更别说检验了。还有写了一堆错误方法真 tmxxx 害人害己,粘贴需谨慎)。
当你关闭----> 没有报错提示 依旧没有任何一丁点一丢丢 作用 并不能 100% 成功 关闭
好既然你这个样子 那就别怪我心狠手辣了 ,从根源切断不留任何后路 。然后此文章就出现了
此贴中有 参考 :
https://blog.csdn.net/zxf1242652895/article/details/84313963
感谢大神
此代码中为我自己后加注释 开箱即用版 舒服 cmd /k D: && cd D:/WindowsETC/ETC_Managent/apache-tomcat/bin && shutdown.bat“------->实践才是检验真理的唯一标准
Windows下tomcat shutdown.bat 无法真正停止
标签:rtu last get index 粘贴 at命令 标准 版本 replace
原文地址:https://www.cnblogs.com/wzy-525/p/13208676.html