`

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

阅读更多



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

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

 

 

  • 大小: 2.2 KB
分享到:
评论

相关推荐

    进程报警器

    在实际应用中,"进程报警器"可能适用于各种场景,比如挂机游戏时保持游戏客户端的运行、监控后台下载任务的进程、保障服务器上的关键服务持续稳定等。总的来说,这是一个方便的工具,可以帮助用户提高效率并减少因...

    系统进程监控软件,进程包活,退出自动重启,适合后台服务软件

    标题和描述中提到的"系统进程监控软件,进程包活,退出自动重启,适合后台服务软件",这指的是一个专门设计用于监视和管理后台服务进程的工具。这类软件的主要功能包括实时监控进程状态,保持进程活动,以及在进程...

    系统进程完全查看工具

    通过这些信息,用户可以判断一个进程是否正常,例如,如果一个进程占用了大量的系统资源,或者它的运行时间与用户预期不符,这可能是病毒或恶意软件的迹象。 对于“各类病毒克星”这一标签,它表明了这个工具不仅是...

    进程守护软件

    1. **自动启动**:当目标软件因异常、系统故障或其他原因关闭时,进程守护软件会监测到这一情况并自动启动该软件,确保服务不间断。这通常通过监听目标进程的生命周期来实现,一旦进程结束,守护进程会立即接收到...

    完整版结束进程模块.rar

    "完整版结束进程模块"可能是一个软件工具或者一组功能,专门设计用于帮助用户更有效地管理和结束计算机上的进程。 在Windows操作系统中,我们可以使用任务管理器来结束进程。打开任务管理器(通过快捷键Ctrl+Shift+...

    进程流量查看

    1. **识别带宽消耗大户**:找出占用带宽最多的进程,这有助于优化网络资源分配,例如,如果一个后台更新或自动同步进程占用了大量带宽,可以考虑调整其工作时间或限制其速度。 2. **诊断网络问题**:当网络速度变慢...

    实用进程异常监控软件

    1. **进程监控**:进程是操作系统中正在执行的一个程序实例,每个进程都有独立的内存空间。通过监控进程,可以了解系统的运行状态,检测异常,防止资源过度消耗或恶意活动。 2. **异常检测**:异常检测技术是通过对...

    进程监控及重启工具

    例如,如果一个进程在一段时间内没有进行任何系统调用,那么可能就判定为卡死。 3. **自动重启**:一旦监控到进程异常,工具将自动执行重启操作。这个过程通常是安全的,因为它会先尝试结束异常进程,然后再启动新...

    vb进程监视器

    5. **用户界面**:虽然这个工具可能是后台运行,但为用户提供一个简单的界面可以方便配置监控参数、查看当前进程状态和历史记录,将有助于提升用户体验。 6. **可扩展性**:考虑到不同服务器可能需要监控多个进程,...

    jenkins远程启动服务

    在“jenkins远程启动服务”这个主题中,我们主要关注如何通过Java的jar包方式启动一个Spring Boot项目,并确保该服务不被Jenkins自身的进程所终止。 首先,我们需要理解Spring Boot应用程序。Spring Boot简化了创建...

    windows 进程监控

    总结来说,通过C#编写服务并结合INI配置文件,我们可以实现一个灵活且可定制的Windows进程监控系统。这不仅可以帮助我们实时了解系统负载,还可以在异常情况发生时及时采取措施,确保系统的稳定运行。在实际开发中,...

    Oracle服务器进程和存储结构归纳.pdf

    专用服务器进程( Dedicated Server Process)为每个客户端连接提供一个单独的服务器进程。这种模式下,每个连接都有自己的后台进程,性能通常较好,但当并发用户数量增加时,服务器资源可能被快速消耗。提交批处理...

    进程监控工具可进行进程.内核,注册表的监控

    如果一个进程试图非法修改内核或滥用系统权限,内核监控就能及时报警,防止潜在的危害。 再者,我们要关注的是“注册表”。注册表是Windows系统存储配置信息的地方,包括系统设置、软件设置和用户设置。病毒和恶意...

    进程管理器,简单实用的服务端程序管理工具

    进程管理器,如"MyProcess",是一种重要的系统工具,它允许用户查看、控制和服务端程序进行交互。在IT领域,进程管理是系统管理员日常维护工作中的核心部分,尤其对于服务端程序的监控和管理至关重要。这类工具能够...

    360问仙半后台挂机小精灵

    【标题】"360问仙半后台挂机小精灵"是一个专为网络游戏《问仙》设计的自动化辅助工具,其主要功能是在玩家无需时刻关注游戏的情况下,进行一些基本的游戏操作,例如自动打怪、采集资源等。由于这类工具通常涉及模拟...

    用Delphi编写后台监控软件.rar_delphi 监控_delphi 后台_delphi 监控_监控软件

    在IT行业中,开发后台监控软件是...总之,Delphi是一个强大的工具,可以用于构建功能丰富的后台监控软件。通过理解系统监控的基本原理,熟练运用Delphi提供的组件和API,你将能够创建出高效、稳定的后台监控解决方案。

    VC SSDT保护进程

    【VC SSDT保护进程】是计算机安全领域中的一个重要概念,主要涉及到系统级的保护机制。在Windows操作系统中,System Service Dispatch Table(SSDT)是一份关键的系统表,它存储了系统服务函数的地址,这些服务函数...

    详解Linux监控重要进程的实现方法

    这时就需要一个监控程序来实现能够让服务进程自动重新启动。查阅相关资料及尝试一些方法之后,总结linux系统监控重要进程的实现方法:脚本检测和子进程替换。 1、脚本检测 (1) 基本思路: 通过shell命令(ps -e | ...

    进程杀手

    5. **用户界面**:作为一个有效的系统工具,"Prockiller V2.1"应具备直观易用的用户界面,使得非技术背景的用户也能轻松理解和操作。 6. **兼容性**:考虑到标签为"系统工具",我们可以推测它可能支持多种操作系统...

    进程监控工具安装包与脚本

    若要管理进程,可以使用`supervisorctl`命令,如启动进程: ```bash sudo supervisorctl start myapp ``` 或者查看所有进程状态: ```bash sudo supervisorctl status ``` 安装脚本通常包含了自动化执行上述步骤...

Global site tag (gtag.js) - Google Analytics