即時通訊編寫此服務器,並且我想檢查是否相同的程序已在運行,如果正在運行關閉程序。如何關閉程序,如果已在Java中打開
說我運行服務器A
然後我運行服務器B(至極是在同一臺服務器)
我想關閉服務器A,以便服務器B可以成功地運行。
即時通訊編寫此服務器,並且我想檢查是否相同的程序已在運行,如果正在運行關閉程序。如何關閉程序,如果已在Java中打開
說我運行服務器A
然後我運行服務器B(至極是在同一臺服務器)
我想關閉服務器A,以便服務器B可以成功地運行。
好吧,我能做到像這樣......使用
public static void main(String[] args){
String PIDtoKill = readPIDFile();
if(!PIDtoKill.isEmpty())
killPID(PIDtoKill);
saveThisPIDtoFile();
}
方法....
private static String readPIDFile() {
try {
for (String line : Files.readAllLines(Paths.get("C:\\Users\\MyUser\\Desktop\\PIDsRunning.txt")))
return line;
}
catch (IOException e1) {
e1.printStackTrace();
}
return "";
}
private static void saveThisPIDtoFile() {
String pid = ManagementFactory.getRuntimeMXBean().getName();
pid = pid.substring(0, pid.indexOf("@"));
List<String> lines = Arrays.asList(pid);
Path file = Paths.get("C:\\Users\\MyUser\\Desktop\\PIDsRunning.txt");
try {
Files.write(file, lines, Charset.forName("UTF-8"));
}
catch (IOException e) {
e.printStackTrace();
}
}
private static void killPID(String pIDtoKill) {
try {
Runtime.getRuntime().exec("taskkill /F /PID " + pIDtoKill);
}
catch (IOException e) {
e.printStackTrace();
}
}
請記住,如果你採取這種途徑,跨平臺的支持(過去的Windows),你需要找到操作系統,並調用操作系統相應的命令'taskkill' –
謝謝,我知道但這只是爲了devoloping的目的,也許我離開它,因爲這個程序將運行在Windows VPS上。 –
如果你想關閉的程序,如果它是開放的
你可以去:
System.exit(0);
還有很多其他退出代碼,但0似乎符合您的要求。
是的,但我不想關閉當前的程序,我想關閉運行的程序,以便新程序可以運行 –
使用系統殺pid的過程是一個解決方案。
可以使用RMI(遠程方法調用)創建單個實例應用程序,或者在您的情況下發送kill函數,以便應用程序可以自行終止。 (正常終止,需要應用來仍在運行。)
你也可以使用一個OSGi的容器:與模塊生命週期的最佳發揮。
查看是否[this](http://stackoverflow.com/questions/660205/start-java-program-only-if-not-already-running)回答您的查詢。 – VHS
'ServerB'需要管理員權限才能關閉'ServerA'。 –
調用'pkill'可能是一個簡單的解決方案。雖然在包裝你的程序的shell腳本中執行它可能更容易,而不是用Java構建它。 –