生活随笔
收集整理的這篇文章主要介紹了
Java获取并Kill系统进程
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原理:獲取系統(tǒng)所有進(jìn)程列表,遍歷,然后進(jìn)行模糊匹配,將匹配到的進(jìn)程殺死!?
作用:保證在系統(tǒng)中只有一個(gè)程序進(jìn)程實(shí)例。
/*** 確保系統(tǒng)中只有一個(gè)程序?qū)嵗? 1.如果客戶端啟動(dòng)前,操作系統(tǒng)中有殘留進(jìn)程,則殺死進(jìn)程,然后啟動(dòng)* 2.如果客戶端啟動(dòng)前,操作系統(tǒng)中沒有殘留進(jìn)程,則直接啟動(dòng)* 時(shí)間:2018-04-13* @author Jason**/
public class SingleProcess {public static Logger logger = Logger.getLogger(SingleProcess.class);/*** 確認(rèn)進(jìn)程,獲取進(jìn)程,殺死進(jìn)程* @param prefix 進(jìn)程名前綴*/public static void comfirmSingleProcess(String prefix) {if(prefix == null) {throw new NullPointerException("The prefix is null,please check it!!");}// 聲明文件讀取流BufferedReader out = null;BufferedReader br = null;try {// 創(chuàng)建系統(tǒng)進(jìn)程ProcessBuilder pb = new ProcessBuilder("tasklist");Process p = pb.start();// 讀取進(jìn)程信息out = new BufferedReader(new InputStreamReader(new BufferedInputStream(p.getInputStream()), Charset.forName("GB2312")));br = new BufferedReader(new InputStreamReader(new BufferedInputStream(p.getErrorStream())));// 創(chuàng)建集合 存放 進(jìn)程+pidList<String> list = new ArrayList<>();// 讀取String ostr;while ((ostr = out.readLine()) != null){// 將讀取的進(jìn)程信息存入集合list.add(ostr);}// 遍歷所有進(jìn)程for (int i = 3; i < list.size(); i++) {// 必須寫死,截取長度,因?yàn)槭枪潭ǖ腟tring process = list.get(i).substring(0, 25).trim(); // 進(jìn)程名String pid = list.get(i).substring(25, 35).trim(); ? ?// 進(jìn)程號(hào)// 匹配指定的進(jìn)程名,若匹配到,則立即殺死if(process.startsWith(prefix)){Runtime.getRuntime().exec("taskkill /F /PID "+pid);?}}// 若有錯(cuò)誤信息 即打印日志String estr = br.readLine();if (estr != null) {logger.error(estr);}} catch (IOException e) {e.printStackTrace();}finally {// 關(guān)流try {if(out != null) { out.close(); }} catch (IOException e) {e.printStackTrace();}try {if(br != null) { br.close(); }} catch (IOException e) {e.printStackTrace();}}}
}
使用示例:
public class Example {public static void main(String[] args) {String prefix = "chrom"; //模糊匹配谷歌進(jìn)程SingleProcess.comfirmSingleProcess(prefix);}
}
-----------------------Linux-----------------------
1.首先通過
Process pid=Runtime.getRuntime().exec("ps -ef");
找出linux當(dāng)前運(yùn)行的所有進(jìn)程。
? 2.再把pid寫入流中:
BufferedReader br = new BufferedReader(new InputStreamReader(pid.getInputStream()), 1024);
3.讀取流中的指定信息:
String line = null;while ((line = br.readLine()) != null) {if(line.contains("進(jìn)程名")){logger.info("進(jìn)程分流信息是:"+line);String [] inf=line.split(" +");for(int j=0;j<inf.length;j++){logger.info("inf["+j+"]="+inf[j]);}logger.info("進(jìn)程號(hào)信息是:"+inf[1]);Process pi=Runtime.getRuntime().exec("kill -9 "+inf[1]);logger.info("已執(zhí)行殺進(jìn)程");}else{// ? ? ? ? ? ? logger.info(""+line);}}
? ?4.這樣就把指定的進(jìn)程給kill成功了!
注:logger.info()是為了打印日志的,可以替換成System.out.println();
總結(jié)
以上是生活随笔為你收集整理的Java获取并Kill系统进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。