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



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

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/alarm
source ../setenv.sh
nohup 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_CN
export JAVA_HOME=/usr/java/jdk1.6.0_16

ADS_HOME=/data/ads
export ADS_HOME
#echo $ADS_HOME

LIBPATH=${ADS_HOME}/lib 
#echo $LIBPATH

for file in ${LIBPATH}/*.jar;
do
#echo $file;
CLASSPATH=$CLASSPATH:$file
done

DISTPATH=${ADS_HOME}/dist
for file in ${DISTPATH}/*.jar;
do
#echo $file;
CLASSPATH=$CLASSPATH:$file
done


export CLASSPATH 

#echo $CLASSPATH

export LD_LIBRARY_PATH=/usr/local/lib

export 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"命令,这样就停止了这个进程

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值