前段时间加入性能测试组,并参与搭建基于locust的性能测试平台,我分到的任务相对独立,开发locust的启动接口和停止运行接口,现开发的差不多了,做一个总结

一、locust运行的相关内容

二、locust操作相关的linux命令

启动locust:"locust -f /usr/fin/FinBomber/LF_"+taskCode+".py --host="+host+" -P "+port

杀掉所有在运行的locust进程:ps -ef |grep locust|grep -v grep | awk '{print $2}' | xargs kill -9

获取所有在运行的locust进程:ps -ef |grep locust|grep -v grep | awk '{print $2}'

获取指定port对应的pid:"/usr/sbin/lsof -i:"+port+"|grep -v grep | awk '{print $2}'|awk 'NR==2{print}'"

杀掉该pid:"kill -9 "+locustPid

三、接口编写思路

1.编写两个接口,一个启动,同时更新数据库相关字段,另一个为停止运行,同时更新数据库相关字段。如下图

2.代码敲着敲着问题就暴露了

问题:java连linux执行启动locust命令(locust -f /usr/fin/FinBomber/LF_"+taskCode+".py --host="+host+" -P "+port),启动是启动了,但是会一直卡那,代码不会继续往下走(往下主要是执行更新数据库操作,后续停止运行接口才能获取到pid,从而杀掉进程),完全不知道咋整,一度觉得整不出来的时候,灵光一现

解决方法:既然启动命令可以完成启动,只是不能继续往下走代码,那就让它别走了,再开一个接口来完成这件事不就好了,傻缺!瞬间觉得我真是天才

最终方案:启动编写两个接口,一个启动,一个更新数据库

-------------------------------解决方法更新---------------------------------

用多线程!!!!瞬间觉得自己之前真是井底之蛙

四、上代码

java连接linux执行命令代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler; public class LinuxCommandUtil {
private static final Logger log = LoggerFactory.getLogger(LinuxCommandUtil.class);
private static String DEFAULTCHART="UTF-8";
/**
* 登录主机
* @return
* 登录成功返回true,否则返回false
*/
public static Connection login(String ip,
String userName,
String userPwd){ boolean flg=false;
Connection conn = null;
try {
conn = new Connection(ip);
conn.connect();//连接
flg=conn.authenticateWithPassword(userName, userPwd);//认证
if(flg){
log.info("=========登录成功========="+conn);
return conn;
}
} catch (IOException e) {
log.error("=========登录失败========="+e.getMessage());
e.printStackTrace();
}
return conn;
} /**
* 远程执行shll脚本或者命令
* @param cmd
* 即将执行的命令
* @return
* 命令执行完后返回的结果值
*/
public static String execute(Connection conn,String cmd){
String result="";
try {
if(conn !=null){
Session session= conn.openSession();//打开一个会话
session.execCommand(String.valueOf(cmd));//执行命令
result=processStdout(session.getStdout(),DEFAULTCHART);
//如果为得到标准输出为空,说明脚本执行出错了
if(StringUtils.isBlank(result)){
log.info("得到标准输出为空,链接conn:"+conn+",执行的命令:"+cmd);
result=processStdout(session.getStderr(),DEFAULTCHART);
}else{
log.info("执行命令成功,链接conn:"+conn+",执行的命令:"+cmd);
}
conn.close();
session.close();
}
} catch (IOException e) {
log.info("执行命令失败,链接conn:"+conn+",执行的命令:"+cmd+" "+e.getMessage());
e.printStackTrace();
}
return result;
}
/**
* 解析脚本执行返回的结果集
* @param in 输入流对象
* @param charset 编码
* @return
* 以纯文本的格式返回
*/
public static String processStdout(InputStream in, String charset){
InputStream stdout = new StreamGobbler(in);
StringBuffer buffer = new StringBuffer();;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset));
String line=null;
while((line=br.readLine()) != null){
buffer.append(line+"\n");
}
} catch (UnsupportedEncodingException e) {
log.error("解析脚本出错:"+e.getMessage());
e.printStackTrace();
} catch (IOException e) {
log.error("解析脚本出错:"+e.getMessage());
e.printStackTrace();
}
return buffer.toString();
}
//获取未占用的端口号
public static String getFreePort(){
ServerSocket serverSocket = null; //读取空闲的可用端口
String localIp = null;
try {
serverSocket = new ServerSocket(0);
localIp = serverSocket.getInetAddress().getLocalHost().getHostAddress();
} catch (IOException e) {
e.printStackTrace();
}
String port = String.valueOf(serverSocket.getLocalPort());
System.out.println("系统分配的端口号 port="+port);
System.out.println("当前本机ip:"+localIp);
//获取当前进程ID
String processName =
java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
System.out.println("当前进程ID:"+Long.parseLong(processName.split("@")[0]));
return port;
}
public static String execLocalCmd(String cmd){
String line="";
try{
Runtime rt = Runtime.getRuntime();
//执行命令, 最后一个参数,可以使用new File("path")指定运行的命令的位置
Process proc = rt.exec(cmd,null,null);
InputStream stderr = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stderr,"GBK");
BufferedReader br = new BufferedReader(isr); while ((line = br.readLine()) != null) { // 打印出命令执行的结果
System.out.println(line);
}
}catch (Exception e){
e.printStackTrace();
}
return line; }
public static void main(String[] args) {
// long currentTimeMillis = System.currentTimeMillis();
String ip = "X.X.X.X";
String username = "XXX";
String password = "XXXXXX";
// String cmd = "sh runLocust.sh";
String cmd = "ps -ef |grep locust|grep -v grep | awk '{print $2}' | xargs kill -9";
Connection connection = login(ip, username, password);
String execmd = execute(connection, cmd);
// System.out.println(execmd);
// long currentTimeMillis1 = System.currentTimeMillis();
// System.out.println("ganymed-ssh2方式"+(currentTimeMillis1-currentTimeMillis));
getFreePort();
} }

最新文章

  1. 在SQL2008查找某数据库中的列是否存在某个值
  2. mysql数据库主从同步
  3. cxf WebService设置wsdl中soapAction的值
  4. sql常用语句(1)
  5. Libevent 的多线程操作
  6. WPF基础——Application
  7. 【Matplotlib】图例分开显示
  8. tar 报错gzip: stdin: not in gzip format
  9. A New Tetris Game
  10. TC Hash Filter
  11. java反射工具类
  12. oracle常见sql积累
  13. block 数组排序
  14. mongodb的tailCursor的设计思想
  15. DOCKER脚本一例---快速建立大批测试机
  16. PXE+kickstart自动安装ubuntu14.04
  17. 深入理解JAVA序列化
  18. Spring Boot - Font Awesome OTS parsing error: Failed to convert 字体加载失败
  19. python selenium 自动化测试web
  20. IIS + FastCGI+php(从5.2升级到5.3)

热门文章

  1. php用逗号格式化数字
  2. Elastic Search对Document的搜索
  3. Spring 注解介绍
  4. T100——读取系统程序临时表数据
  5. C# WPF 数据绑定
  6. O052、Create Volume 操作 (Part III)
  7. Selenium 基本使用
  8. Springboot Hikari Centos 首次连数据库很慢
  9. vue-element-admin 多层路由问题
  10. 5.Struts2-Struts标签