2011-07-15 53 views
2

完成後殺死在Java中的過程中,我也有類似的代碼:如何工作的在Java

URL url = Activator.getDefault().getBundle().getEntry("/resources/server.bat"); 
String fileURL = FileLocator.toFileURL(url).toString(); 
String commandLine = "cmd.exe /c start " +fileURL; 
Process process= Runtime.getRuntime().exec(commandLine); 

我如何能夠儘快殺死進程的工作是用Java做

+0

當然當工作反正做衍生的應用程序退出? server.bat做什麼? –

回答

5

process.destroy()

但它將不具有通過過程控制從server.bat開始那些被單獨啓動

+0

謝謝你是我正在尋找..... server.bat正在創建一個文件(例如)我想殺死進程asoon作爲文件被創建...有可能嗎? – sanju

+0

是<!---------------------> –

+0

謝謝 對於我的情況,直到主應用程序終止它不創建新文件...請有關該 – sanju

0

的Runtime.exec創建一個進程,其ACTUA lly是目標機器上的一個子shell。這個特定的子shell可以使用process.destroy()來終止或終止。方法。但是特定的子進程可能會在批處理或shell腳本中爲其他外部命令產生許多其他子進程。如果我們殺死父母程序,子程序可能不會被殺死,這可能會使情況惡化。

+0

謝謝Amit 我可以使用wait()notify()檢查是否爲特定的.bat文件完成了作業(例如創建新文件) – sanju

+0

否您不能在此處使用wait() - notify()。使用運行時間calss只能執行系統命令或腳本。啓動Runtime.exec()後,命令或腳本的控制權不在JVM的範圍內。這是你開發的一個系統命令,因此它正在被操作系統運行。您只能控制Process類的對象,該對象可用於收集commnad的輸出或提供輸入或銷燬進程。有一個waitFor()方法可用於保持當前線程終止,除非Process對象擁有的子進程終止。 – Amit

+0

謝謝你Amit ..我會試試這個,如果我使用Process Builder並直接提供其他使用runtime.exe()的其他東西,那麼還有什麼?實際上我的情況下,直到應用程序終止server.bat不會創建新的文件... – sanju

0

首先,您必須已經知道,當您執行Java程序時,它將在JVM(Java虛擬機)上運行。因此,當您執行「tasklist」命令時,您將無法看到您的Java進程名稱。

幸運的是,當您安裝了JDK時,您可以使用Java虛擬機進程狀態工具查看計算機上正在運行的所有Java進程。要使用它,只需輸入「jps」命令:

正如您所看到的「jps」命令爲您提供了所有必需的信息,如PID和java進程名稱。所以通過使用java進程名稱,您現在可以終止所需的進程。

在這裏你可以找到神奇的命令行:

for /f "tokens=1" %i in ('jps -m ^| find "JAVA_PROCESS_NAME"') do (taskkill /F /PID %i) 

該命令將執行「JPS -m」命令並獲得包含給定「JAVA_PROCESS_NAME」的Java進程的PID並執行「 taskkill/F/PID「結束。 N.B.1:用您自己的進程名稱替換「JAVA_PROCESS_NAME」。 N.B.2:爲bat文件放置一個雙%(%% i)而不是一個。

例如,殺了Eclipse程序鍵入以下命令:

C:\Users\YannickL>for /f "tokens=1" %i in ('jps -m ^| find "Eclipse"') do (taskkil l /F /PID %i) C:\Users\YannickL>(taskkill /F /PID 5076) SUCCESS: The process with PID 5076 has been terminated.