后台启动一个进程(报警)
http://dl.iteye.com/upload/attachment/424265/b0de6e10-5a35-3ae7-a632-9bb4a708cd33.png
当点击启动的时候,会调用后台的代码(当然会传一个参数过去)
public String start() {String appName=(String)paramMap.get("appName");if (appName!=null){String masHome=System.getenv("ADS_HOME"); String appCmd=null;String appPath=null;if (appName.equals("AlarmMain")){ appPath=masHome+"/bin/alarm";appCmd=appPath+"/alarm.sh";}try {if (appCmd!=null){ProcessBuilder pb=new ProcessBuilder(appCmd);pb.directory(new File(appPath));pb.start();logger.debug( "用户:" + getLoginUserName()+" 启动模块:"+appName);Thread.sleep(2000);} } catch (Exception e) { logger.warn(StringUtil.getStackTrace(e));}}return "redirect:list";} 这样后台就会启动一个进程执行一个命令appCmd,这样就执行了alarm.sh的shell脚本
cd ${ADS_HOME}/bin/alarmsource ../setenv.shnohup java -DADS_HOME=$ADS_HOME com/listong/ads/alarm/AlarmMain applicationContext.xml alarm.conf >/dev/null &echo $! >${ADS_HOME}/bin/alarm/server.pid
又会执行setenv.sh的脚本,此脚本是用于添加运行环境什么的
export LANG=zh_CNexport JAVA_HOME=/usr/java/jdk1.6.0_16ADS_HOME=/data/adsexport ADS_HOME#echo $ADS_HOMELIBPATH=${ADS_HOME}/lib #echo $LIBPATHfor file in ${LIBPATH}/*.jar;do#echo $file;CLASSPATH=$CLASSPATH:$filedoneDISTPATH=${ADS_HOME}/distfor file in ${DISTPATH}/*.jar;do#echo $file;CLASSPATH=$CLASSPATH:$filedoneexport CLASSPATH #echo $CLASSPATHexport LD_LIBRARY_PATH=/usr/local/libexport PATH=$PATH:${JAVA_HOME}/bin执行完后会跳到list方法去 public String list() { List<PsInfo> pidList=new ArrayList();String appNames[]={"AlarmMain"}; for (int i=0;i<appNames.length;i++){PsInfo pi=PsUtil.getPsInfo(appNames);if (pi==null){pi=getZeroPsInfo(appNames);}pidList.add(pi);} storeInRequest("pidList", pidList); return "pidlist.jsp";} 然后执行PsUtil的getPsInfo的方法,这样就可以获得linux下的进程的信息包括pid也就是进程号,获得之后存起来。package com.listong.ads.util.tool;import java.io.BufferedReader;import java.io.File;import java.io.IOException;import java.io.InputStreamReader; import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class PsUtil { private static final Logger logger = LoggerFactory.getLogger(PsUtil.class);public static void main(String[] args) { ProcessBuilder pb = new ProcessBuilder("/data/mas/bin/sms/sms.sh"); //Map env = pb.environment();//env.put("key1", "value1");//env.remove("key2");//env.put("key2", env.get("key1") + "_test"); pb.directory(new File("/data/mas/bin/sms")); // 设置工作目录try {Process p = pb.start();} catch (IOException e) { e.printStackTrace();} // 建立子进程 /*String str=getPsStr(args);System.out.println(str);PsInfo pi=getPsInfo(args);if (pi!=null)System.out.println(pi.getUser()+ " "+pi.getPid()+" "+pi.getCpuPercent()+" "+pi.getMemPercent()+" "+pi.getVsz()+" "+pi.getRss()+" "+pi.getTty()+" "+pi.getStat()+" "+pi.getStart()+" "+pi.getTime());*/}public static PsInfo getPsInfo(String grepStr){PsInfo pi=new PsInfo();pi.setAppName(grepStr);try{ String str=getPsStr(grepStr);if (str==null){return null;}while (true){ if (str.indexOf("")>0){str=str.replaceAll("", " ");}else{break;}}String strs[]=str.split(" ");pi.setUser(strs);pi.setPid(strs);pi.setCpuPercent(strs);pi.setMemPercent(strs);pi.setVsz(strs);pi.setRss(strs);pi.setTty(strs);pi.setStat(strs);pi.setStart(strs); pi.setTime(strs); }catch(Exception e){ e.printStackTrace();}return pi;}public static String getPsStr(String grepStr){Process p = null;BufferedReader br=null;try {//执行命令p = new ProcessBuilder("ps","aux").start(); br=newBufferedReader(new InputStreamReader(p.getInputStream())); String line=null;while (true){line=br.readLine();if (line==null){ return null;}if (line.indexOf("com.moto.mas.util.tool.PsUtil")>0){continue;}if (line.indexOf(grepStr)>0){ return line;}}} catch (Exception e) {e.printStackTrace();return null;}finally{try {if (br!=null)br.close();} catch (Exception e2) {}} }public static PsInfo getPsInfoByPID(String pId){PsInfo psInfo = new PsInfo();psInfo.setAppName(pId);Process p = null;BufferedReader br=null;try {//执行命令p = new ProcessBuilder("ps","aux").start(); br=newBufferedReader(new InputStreamReader(p.getInputStream())); String line=null;while (true){line=br.readLine();if (line==null){ return null;}while (true){ if (line.indexOf("")>0){line=line.replaceAll("", " ");}else{break;}}String strs[]=line.split(" "); if(strs.equals(pId)==true){psInfo.setUser(strs);psInfo.setPid(strs);psInfo.setCpuPercent(strs);psInfo.setMemPercent(strs);psInfo.setVsz(strs);psInfo.setRss(strs);psInfo.setTty(strs);psInfo.setStat(strs);psInfo.setStart(strs); psInfo.setTime(strs); break;}}} catch (Exception e) {e.printStackTrace();return null;}finally{try {if (br!=null)br.close();} catch (Exception e2) {}} return psInfo;}public static String getDuStr(String path){Process p = null;BufferedReader br=null;try {//执行命令p = new ProcessBuilder("du","sh",path).start(); br=newBufferedReader(new InputStreamReader(p.getInputStream())); String line=br.readLine();logger.debug("du -sh path @@ disk line == " + line);if (line==null){ return null;}int ind = line.indexOf("/");String s = line.substring(0,ind-1);logger.debug("du -sh path @@ disk Use == " + s);return s;} catch (Exception e) {logger.error("",e);return null;}finally{try {if (br!=null)br.close();} catch (Exception e2) {}} }} 上面的PsUtil的类就相当在linux下执行了"ps"的命令来查看进程。 有了进程的信息,这样我们就可以根据进程的pid来停止此进程,传一个pid过去到stop方法去停止进程public String stop() { String pid=(String)paramMap.get("pid");try {new ProcessBuilder("kill",pid).start();logger.debug( "用户:" + getLoginUserName()+" 停止进程ID:"+pid);Thread.sleep(2000);} catch (Exception e) { logger.warn(StringUtil.getStackTrace(e));} return "redirect:list";} 上面就是在linux下执行"kill"命令,这样就停止了这个进程
页:
[1]