`
gtgt1988
  • 浏览: 114277 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

试用的管理进程的Java类

 
阅读更多
进程的基本信息类
public class ProcessDefDto {
	private long omcId;
	private String command;//启进程命令
	private int port;//端口号
	private int collectType;//采集类型,0 snmp,1 tl1
	

	public ProcessDefDto(){
		
	}
public ProcessDefDto(long omcId,String command,int port,int   collectType){
	this.omcId= omcId;
	this.command= command;
	this.port= port;
	this.collectType= collectType;
	 
	}
	
	public void setOmcId(long omcId){
		this.omcId= omcId;
	}
	public long getOmcId(){
		return this.omcId;
	}
	public void setCommand(String command){
		this.command= command;
	}
	public String getCommand(){
		return this.command;
	}
	
	public void setPort(int port){
		this.port= port;
	}
	public int getPort(){
		return this.port;
	}
	
	public void setCollectType(int collectType){
		this.collectType= collectType;
	}
	public int getCollectType(){
		return this.collectType;
	}
	
	 
}



一系列的进程
public class ProcessManager  {
	private static Logger log = Logger.getLogger(MonitorThread.class);
	private static Vector<ProcessDefDto> processDefs = new Vector<ProcessDefDto>();
	private Map<String, String> mapCmds   = new HashMap<String, String>();
	/** 起始端口  **/
	private String start_port="start_port";
	/**启动命令  **/
	private String snmp_key="snmp_cmd";
	private String tl1_key="tl1_cmd";
	private String tl1_parse_key="tl1_parse_cmd";
	private String snmp_parse_key="snmp_parse_cmd";
	private String tl1_alm_key="tl1_alm_cmd";
	private String tl1_coll_key="tl1_coll_cps";
	private String res_cj_key="res_cj";

	
	private int defaultPort=6000;
	public ProcessManager(Map<String, String> mapCmds){
		this.mapCmds=mapCmds;
	}
	//初始化所有待启动进程
	public boolean  initprocessDefs(String areaIds){
		long t1=System.currentTimeMillis();
		Map<Integer,String> omcmap=PonCollectorDaoServiceProvider.getOmcConfigDao().findOmcIdByAreaIds(areaIds);
		
		String snmp_cmd=mapCmds.get(snmp_key);
		String tl1_cmd=mapCmds.get(tl1_key);
		String tl1_parse_cmd=mapCmds.get(tl1_parse_key);
		String snmp_parse_cmd=mapCmds.get(snmp_parse_key);
		String tl1_alm_cmd=mapCmds.get(tl1_alm_key);
		String tl1_coll_cps=mapCmds.get(tl1_coll_key);
		String res_cj=mapCmds.get(res_cj_key);
		
		if(mapCmds.get(start_port)!=null&&!mapCmds.get(start_port).equals("")){//配置的端口号不为空,则取配置 的端口号。
			defaultPort=Integer.valueOf(mapCmds.get(start_port));
		};
		log.info("区域areaId:"+areaIds+",对应OMCID数:"+omcmap.size());
		ServicePortManager portmgr=	new ServicePortManager();
		//增加SNMP采集进程
		if (snmp_cmd != null && !snmp_cmd.equals("")) {
			for (Integer omc : omcmap.keySet()) {
				ProcessDefDto proDef = new ProcessDefDto();
				int port = portmgr.initPort(defaultPort, String.valueOf(omc),
						ServicePortManager.SNMPTYPE);
				defaultPort = port + 1;
				proDef.setOmcId(omc);
				proDef.setCommand(snmp_cmd + " " + omc + " " + port);
				proDef.setPort(port);
				proDef.setCollectType(0);
				processDefs.add(proDef);
			}
		} else {
			log.info("SNMP启动命令没有配置");
		}
	
		//增加TL1解析进程
		if (tl1_parse_cmd != null && !tl1_parse_cmd.equals("")) {
			String[] areas = areaIds.split(",");

			CollRmiCfg crc = PonCollectorDaoServiceProvider.getCollRmiCfgDao()
					.getPortById((short) Integer.parseInt(areas[0]), (short) 3);
			String ip = crc.getServerIp();
			String cmds[] = tl1_parse_cmd.split("\\|\\|");
			for (String area : areas) {
				for (String cmd : cmds) {
					ProcessDefDto proDef = new ProcessDefDto();
					String newCmd = cmd.replaceAll("\\{ip\\}", ip);
					proDef.setCommand(newCmd + " " + area);
					proDef.setCollectType(1);
					processDefs.add(proDef);
				}
			}
		} else {
			log.info("TL1解析进程启动命令没有配置");
		}
		//增加TL1告警进程
		if (tl1_alm_cmd != null && !tl1_alm_cmd.equals("")) {
			for (Integer omc : omcmap.keySet()) {
				ProcessDefDto proDef = new ProcessDefDto();
				int port = portmgr.initPort(defaultPort, String.valueOf(omc),
						ServicePortManager.TL1TYPE);
				defaultPort = port + 1;
				String factory = omcmap.get(omc);
				proDef.setOmcId(omc);
				proDef.setCommand(tl1_alm_cmd + " " + omc + " " + factory
						+ " "+port);
				proDef.setPort(port);
				proDef.setCollectType(1);
				processDefs.add(proDef);
			}
		} else {
			log.info("TL1启动命令没有配置");
		}
	public void startAllProcess(){
		for(ProcessDefDto pro:processDefs){
			startProc(pro);
		}
	}
	public void stopAllProcess(){
		for(ProcessDefDto pro:processDefs){
			stopProc(pro);
		}
	}
	public void startProc(ProcessDefDto pro){
		ProcessUtil.startProcess(pro.getCommand());
	}
	public void stopProc(ProcessDefDto pro){
		ProcessUtil.stopProcess(pro.getCommand());
	}
	
	public Vector<ProcessDefDto> getProcessDefs(){
		return processDefs;
	}
}
没有列举太多的进程信息


一个线程监控所有的进程
public class MonitorThread extends Thread{
	private static Logger log = Logger.getLogger(MonitorThread.class);
	
	public void run(){
		 ProcessManager pm =CollectServiceProvider.getProcessManager();
		Vector<ProcessDefDto> processManagerDtos = pm.getProcessDefs();
		 
		log.info("monitor thread start...");
		while (true) {
				Map<String, String[]> map = ProcessUtil.getProcessInfo();
				if(map!=null){
					for (ProcessDefDto managerDto : processManagerDtos) {
						String[] status = map.get(managerDto.getCommand());
						if (ProcessUtil.isDown(status)) {// 进程满足挂起僵死条件,则进行重启
							log.info("进程启动>"+managerDto.getCommand());
							if(status!=null){
								pm.stopProc(managerDto);
							}
							pm.startProc(managerDto);
						}
					}
				 
				}
			 
			try {
				Thread.sleep(15000);
			} catch (InterruptedException e) {
				log.error("InterruptedException",e);
			}
		}
	}
}



/**
 * 进程启动停止等工具类
 */
public class ProcessUtil {
	private static Logger log = Logger.getLogger(ProcessUtil.class);
	public final static String PROCESS_INFO_CMD_LINUX = "ps axo pid,stat,command";
	public final static String PROCESS_INFO_CMD_AIX = "ps -efo pid,state,args";
	public final static String PROCESS_INFO_CMD_SunOS = "/usr/ucb/ps -axww";
	private final static Map<String, String> osCmdMap = new HashMap<String, String>(){	{
		put("Linux", PROCESS_INFO_CMD_LINUX);
		 put("AIX", PROCESS_INFO_CMD_AIX);
		 put("SunOS", PROCESS_INFO_CMD_SunOS);
	}};
	private static Runtime runtime = Runtime.getRuntime();
	public static boolean startProcess(String cmd){
		 
			try{
				Process process = runtime.exec(cmd);
				new ConsoleThread(process,cmd).start();
				return true;
			}catch (Exception e) {
				log.error("error in start "+ cmd,e);
			}
		 
		return false;
	}
	public static boolean stopProcess(String cmd){
		try{
			Map<String, String[]> map = getProcessInfo();
			if(map!=null){
				String[] info = map.get(cmd);
				if(info!=null){
					runtime.exec("kill -9 "+info[0]);
				}else{
					log.info("can not find process " + cmd);
				}
			}
			return true;
		}catch (Exception e) {
			log.error("error in stop "+ cmd,e);
		}
		log.info("stop failed ");
		return false;
	}
	public synchronized static Map<String, String[]> getProcessInfo(){
		String osName = System.getProperty("os.name");
		String cmd = osCmdMap.get(osName);
		try{
			if ("Linux".equals(osName)||"AIX".equals(osName)) {
				Process p = runtime.exec(cmd);
				BufferedInputStream in = new BufferedInputStream(p.getInputStream());
				BufferedReader br = new BufferedReader(new InputStreamReader(in));
				String str = new String();
				Map<String, String[]> map = new HashMap<String, String[]>();
				while ((str = br.readLine()) != null) {
					Scanner s = new Scanner(str);
					String pid = s.next();
					String state = s.next();
					String command = str.substring(str.indexOf(state)+state.length()).trim();
					map.put(command, new String[]{pid,state});
					s.close();
				}
				br.close();
				in.close();
				p.destroy();
				return map;
			}else if("SunOS".equals(osName)){
				Process p = runtime.exec(cmd);
				BufferedInputStream in = new BufferedInputStream(p.getInputStream());
				BufferedReader br = new BufferedReader(new InputStreamReader(in));
				String str = new String();
				Map<String, String[]> map = new HashMap<String, String[]>();
				while ((str = br.readLine()) != null) {
					Scanner s = new Scanner(str);
					String pid = s.next();
					s.next();
					String state = s.next();
					String index = s.next();
					String command = str.substring(str.indexOf(index)+index.length()).trim();
					map.put(command, new String[]{pid,state});
					s.close();
				}
				br.close();
				in.close();
				p.destroy();
				return map;
			}else{
				log.debug(osName + " monitor unimplementate ");
				return null;
			}
		}catch (Exception e) {
			log.error("",e);
			return null;
		}
		
	}
	/**
	 * 进程运行是否正常
	 * @param status
	 * @return
	 */
	public static boolean isDown(String[] status){
		if(status==null) return true;
		String osName = System.getProperty("os.name");
		if ("Linux".equals(osName)) {
			if(status[1].equals("X") || status[1].equals("Z")){//X:死掉的进程 Z:僵尸进程
				return true;
			}else{
				return false;
			}
		}else if ("AIX".equals(osName)){
			if(status[1].equals("Z") || status[1].equals("T")){//Z:已取消 T:已停止
				return true;
			}else{
				return false;
			}
		}else if("SunOS".equals(osName)){
			if(status[1].equals("Z") || status[1].equals("T")){//Z:已取消 T:已停止
				return true;
			}else{
				return false;
			}
		}else{
			log.debug(osName + " monitor unimplementate ");
			return false;//不处理
		}
	}
}




/**
 * 控制台输出线程,防止被管进程由于控制台导致的进程挂起
 *
 */
public class ConsoleThread extends Thread {
	private Logger log = Logger.getLogger(ConsoleThread.class);
	private Process process = null;
	private String commad = null;
	public ConsoleThread(Process process,String commad) {
		this.process = process;
		this.commad = commad;
	}

	public void run() {
		if(this.process ==null) return;
		log.info(this.commad +" console thread start.");
		BufferedInputStream in = new BufferedInputStream(this.process.getInputStream());
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		try {
			String s = br.readLine();
			while (s != null) {
				System.out.println(s);
				s = br.readLine();
			}
		} catch (Exception e) {
			log.error(this.commad, e);
		} finally {
			try {
				br.close();
				in.close();
			} catch (Exception e) {
				log.error(this.commad, e);
			}
		}
		log.info(this.commad + " end");
	}
}

 

分享到:
评论

相关推荐

    UML-JAVAWEB企业人事管理系统

    《UML在JAVA WEB企业人事管理系统中的应用》 UML(Unified Modeling Language,统一建模语言)是软件工程领域一种广泛使用的建模工具,它为软件开发提供了图形化的表示方式,便于理解和交流软件设计思想。在JAVA ...

    Java学习开发

    Java框架是Java开发中一个重要的概念,它是设计用来简化软件开发的一套规则、类和对象集合,可以用于管理应用程序的结构。Java框架通常提供了一些工具和库,使得开发者可以不必从头开始编写代码,而是可以重用已有的...

    2022年java程序员的转正工作总结.docx

    他们懂得在问题出现初期及时纠正,避免问题的恶化,确保项目进程不受影响。同时,与团队和领导的沟通至关重要,对于有争议的需求或问题,他们会积极参与讨论,确保开发方向的一致性。 2. **职责明确,记录与总结** ...

    Elasticsearch 6.5.1 xpack 试用版安装教程20200701.pdf

    Elasticsearch是用Java开发的,并在Apache许可证下作为开源发布。它是一种广泛使用的搜索引擎和数据分析工具。Elasticsearch在全文搜索、日志分析、安全监控、应用监控、网站搜索等多个领域有着广泛的应用。 ...

    gradle-8.3-all.zip 快速下载

    Gradle-8.3 此版本支持持久性Java编译器守护进程加速Java编译。格拉德也会用减少依赖关系解析的内存。这种影响是显著的,特别是对于像Android这样的大型构建。 Gradle现在支持在Java 20上运行。 对于Kotlin DSL,...

    IBM-MQ-9.1.5-LINUX-X86-64-TRIAL.tar.gz

    1. **MQServer**:这是IBM MQ服务器的主要组成部分,包括了MQ的守护进程(qmfagentd、mqm、qmstartd等)、管理工具以及运行时库。这些组件使得IBM MQ能够在Linux环境下运行,并提供消息队列服务。 2. **安装脚本与...

    BES8.x快速入门手册

    - **应用服务器实例体系结构**:应用服务器实例是在单一JVM进程中运行的应用服务器。可通过命令行工具iastool或管理控制台进行配置管理。 #### 四、BES的管理架构和基本操作 - **管理架构**:由DMS、NodeAgent和...

    IBM_MQ_9.1_WINDOWS_TRIAL

    4. 服务和守护进程:启动和管理IBM MQ服务器进程。 5. JMS客户端库:用于Java应用程序的消息接口。 6. 其他语言的SDK:如.NET SDK,便于非Java应用的开发。 通过这个试用版,用户可以深入了解IBM MQ的功能特性,并...

    汽车行驶数据管理软件的设计与实现的开题报告.docx

    4. 推动行业发展:该软件的推广将促进汽车行驶数据管理软件的进步,助力汽车行业智能化和信息化进程。 按照预设的时间表,本研究计划在2021年6月至2022年6月期间完成,涵盖需求分析、系统设计、编码实现、系统测试...

    面向场景的灵活 3D 引擎(C++、Python、C#、Java).zip

    该类库抽象了使用 Direct3D 和 OpenGL 等底层系统库的所有细节,并提供了基于世界对象和其他直观类的接口。尝试一下- 构建- 教程- 手册- 有什么新东西? - 谁在使用它? - 社区支持特征如需查看详尽列表,请参阅功能...

    JProfiler11_x64_jb51安装与解密.7z

    5. 连接应用:JProfiler支持多种连接模式,包括本地连接(附着到已运行的进程)和远程连接(通过网络连接到远程服务器上的Java应用)。根据你的需求选择相应的连接方式。 6. 分析:一旦连接成功,你就可以开始进行...

    开题报告ssm781基于SSM的体育用品交易网站的设计与实现+vue开题.docx

    综上所述,本课题旨在利用SSM框架构建一个功能完善、用户体验优良的体育用品交易网站,以适应日益增长的在线购物需求,推动体育用品市场的电子商务化进程。通过深入研究和实践,有望为类似项目的开发提供有价值的...

    ILIKE CRM 原型系统

    2. 强大的库支持:JAVA拥有丰富的开源库和框架,如Spring、Hibernate等,可以加速开发进程,提高代码质量。 3. 安全性:JAVA内置的安全机制有助于保护用户数据,防止潜在的安全威胁。 4. 社区支持:JAVA拥有庞大的...

    MyEclipseJieMi.zip

    同时,提供大量的Java EE模板,如Struts、Spring、Hibernate等,加速企业级应用的开发进程。 6. **图形化界面设计**:通过WYSIWYG方式设计JSP、HTML、JSF页面,提高UI开发效率。 7. **插件集成**:集成众多开发工具...

    基于JavaWeb的在线考试系统的设计与实现-进度汇报PPT.pptx

    因此,开发一款高效、实用的在线考试系统成为当前教育信息化进程中的一个重要课题。 本项目旨在设计并实现一个基于JavaWeb技术的在线考试系统。该系统能够支持学生的在线答题、教师的试题管理及成绩评定等功能,...

    中标麒麟高级服务器V7系统下安装达梦8.docx

    为了支持DM8的正常运行,需要增加`dmdba`用户的最大打开文件句柄数和最大进程数。在`/etc/security/limits.conf`文件中添加对应的配置,然后通过`sysctl –p`命令使更改生效。 5. **给dmdba添加sudo授权**: 编辑...

    Demo.rar_Android点名系统_DEMO_随机抽取_随机点名

    例如,SQLite数据库用于存储学生的名单和点名记录,RecyclerView或者ListView组件用于展示学生列表,Button控件用于触发点名操作,随机数生成器(java.util.Random类)则用于实现随机抽取功能。 系统的界面设计强调...

Global site tag (gtag.js) - Google Analytics