之前写了一个小java程序,有个需求是不允许该程序同时运行多个。当启动程序后,会判断是否已有进程在运行,如果正在运行,则显示“该程序已经运行”的提示信息,并退出,如果没有则启动这个程序。
网上查了很多,发现很多方法,如通过jni判断进程号,或通过runtime.exec方法调用tasklist命令判断当前进程,但这些都不能很好的满足程序的跨平台型,当然可以做个判断,如是win则用tasklist,linux用ps。但效果不佳。不过也给我提供了一些灵感。这里我稍微改进一下,有个折中的方法,使用jps来获得java进程,jps是sun的jdk自带的一个jvm运行进程查看工具,无论win还是lin都有,至少能够支持跨平台,代码如下。
private static boolean checkPidInProcess(String pid) throws Exception {
InputStream in = Runtime.getRuntime().exec("jps").getInputStream();
BufferedReader b = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = b.readLine())!=null){
if(line.startsWith(pid)){//我这里是通过pid来识别(pid可以通过MBean获取),其实完全可以改成通过类名来识别
if(line.indexOf(EICMain.class.getSimpleName()) >=0){
return true;
}
}
}
return false;
}
有更好的办法,欢迎讨论