当点击启动的时候,会调用后台的代码(当然会传一个参数过去)
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"命令,这样就停止了这个进程