Windows下tomcat shutdown.bat 無法真正停止


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 后就干掉它:

taskkill /pid 進程號 -t -f

  

 

 

 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<Integer> 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<String> 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<String> read(InputStream in,String charset) throws IOException{ List<String> 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<String> data) { Set<Integer> 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<Integer> 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“------->實踐才是檢驗真理的唯一標准

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM