首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

后盾启动一个进程(报警)

2012-11-23 
后台启动一个进程(报警)?当点击启动的时候,会调用后台的代码(当然会传一个参数过去)public String start()

后台启动一个进程(报警)

后盾启动一个进程(报警)
?当点击启动的时候,会调用后台的代码(当然会传一个参数过去)

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[i]);if (pi==null){pi=getZeroPsInfo(appNames[i]);}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[0]);System.out.println(str);PsInfo pi=getPsInfo(args[0]);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[0]);pi.setPid(strs[1]);pi.setCpuPercent(strs[2]);pi.setMemPercent(strs[3]);pi.setVsz(strs[4]);pi.setRss(strs[5]);pi.setTty(strs[6]);pi.setStat(strs[7]);pi.setStart(strs[8]); pi.setTime(strs[9]);     }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=new  BufferedReader(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=new  BufferedReader(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[1].equals(pId)==true){psInfo.setUser(strs[0]);psInfo.setPid(strs[1]);psInfo.setCpuPercent(strs[2]);psInfo.setMemPercent(strs[3]);psInfo.setVsz(strs[4]);psInfo.setRss(strs[5]);psInfo.setTty(strs[6]);psInfo.setStat(strs[7]);psInfo.setStart(strs[8]); psInfo.setTime(strs[9]);    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=new  BufferedReader(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"命令,这样就停止了这个进程

?

?

热点排行