package com.taobao.zeus.jobs.sub.tool; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.taobao.zeus.jobs.JobContext; import com.taobao.zeus.jobs.sub.ShellJob; import com.taobao.zeus.schedule.mvc.ScheduleInfoLog; import com.taobao.zeus.util.Environment; import com.taobao.zeus.util.RunningJobKeys; public class MemUseRateJob extends ShellJob{ private double rate; public MemUseRateJob(JobContext jobContext,double rate) { super(jobContext,"free -m | grep buffers/cache"); /** * 添加一个表示是否为心跳的标示符 */ jobContext.getProperties().getAllProperties().put(RunningJobKeys.JOB_RUN_TYPE, "MemUseRateJob"); this.rate=rate; } static Pattern pattern=Pattern.compile("\\d+"); private static Date date=new Date(); @Override public Integer run() throws Exception { //window mac 系统直接返回成功 String os=System.getProperties().getProperty("os.name"); if(os!=null && (os.startsWith("win") || os.startsWith("Win") || os.startsWith("Mac"))){ //放一个假的数字,方便开发 jobContext.putData("mem", Environment.getMaxMemRate().doubleValue()); return 0; } Integer exitCode=super.run(); if(exitCode==0){ String[] content=getJobContext().getJobHistory().getLog().getContent().split("\n"); for(String s:content){ if(s.contains("buffers/cache")){ String line=s.substring(s.indexOf("buffers/cache:")); Matcher matcher=pattern.matcher(line); double used=0d; double free=0d; int num=0; while(matcher.find()){ if(num==0){ used=Double.valueOf(matcher.group()); num++; continue; } if(num==1){ free=Double.valueOf(matcher.group()); break; } } if((new Date().getTime()-date.getTime())>3*60*1000){ ScheduleInfoLog.info("mem use rate used:"+used+" free:"+free+" rate:"+(used/(used+free))); date=new Date(); } // 可能迭代不到,迭代到的话这里就会return,所以最后面应该return -1 jobContext.putData("mem", (used/(used+free))); if(used/(used+free)>rate){ return -1; }else{ return 0; } } } } return -1; } }