Appium 使用命令开启多个 appium 服务后怎么关闭

websky · July 08, 2016 · Last by Sutune replied at January 22, 2018 · 4105 hits

我用java开启多个appium服务,然后想关闭指定的端口下的服务该怎么做;
目前情况是命令已经知道但是在执行命令后没有一点反应,程序好像就是在appium服务界面一样无法输入任何命令,但我又不知道如何在命令行模拟ctrl+c的操作结束服务。
如果我在另外一个main函数执行杀进程的命令是可以结束的。
一直被困扰的一个问题望各位能给个解决的办法或者思路,不胜感激!

这是我启动服务的代码

package com.ben.test;

import java.io.*;

public class AppiumServer {
public Process pc;
Runtime rt;
Thread thread1;
Thread thread2;

public void sunServer(String cmd) throws Exception {
// TODO Auto-generated method stub
rt = Runtime.getRuntime();
String[] command = { "cmd", "/c", cmd };
pc = rt.exec(command);
thread1 = new Thread(new Input());
thread1.start();
thread1.sleep(500);
thread2 = new Thread(new Output());
thread2.start();
}
class Output implements Runnable {
public void run() {
OutputStream fos = pc.getOutputStream();
PrintStream ps = new PrintStream(fos);

ps.flush();

}
}
class Input implements Runnable {

public void run() {
InputStream ios = pc.getInputStream();
BufferedReader brd = new BufferedReader(new InputStreamReader(ios));
String s;
try {
while ((s = brd.readLine()) != null) {
System.out.println(s);
}
} catch (Exception e) {
}
}
}
}

这是测试代码

@Test
public void test() {
int port = 4723;
int bp = port + 1;
String cmd = "appium -p " + port + " -bp " + bp
+ " --session-override -a 127.0.0.1";
try {
AppiumServer as = new AppiumServer();
as.sunServer(cmd);//开启服务
Thread.sleep(5000);
DesiredCapabilities capabilities = new Devices().getcapabilities(
"MYVDU15629008926", "taobao.apk");//参数设置
AndroidDriver<?> driver1 = new AndroidDriver(new URL(
"http://127.0.0.1:4723/wd/hub"), capabilities);
Devices.DeviceMonitor(driver1);//执行脚本
cmd = "netstat -ano | findstr " + port + " > "+port+".txt for "
+ "/f \"tokens=5\" %%a in (" + port
+ ".txt) do Taskkill /f /IM %%a";
Runtime.getRuntime().exec(new String[] {"cmd", "/c", cmd});//执行杀进程命令
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
共收到 9 条回复 时间 点赞

OS X 10.11.4 ,启动命令是appium -p 4030的话,结束用

lsof -n -i:4030 | grep LISTEN | awk '{print $2}' | xargs kill

或者

ps | grep -i 'appium -p 4030' | head -n 1 | awk '{print $1}' | xargs kill

windows上也有类似的命令

有几个杀几个,无需care端口
ps -A | grep node | grep -v grep | awk 'NR=1 {print $1}' | xargs kill -9

String[] command = { "cmd", "/c", cmd };

所以就是windows咯,win下有tasklist, taskkill。用 taskkill 根据窗口标题来杀吧,或者如果没有其它node的话可以根据node.exe来杀。
taskkill /?

websky #4 · July 11, 2016 作者

#3楼 @watman

—— 来自TesterHome官方 安卓客户端

websky #5 · July 11, 2016 作者

#3楼 @watman 杀node的话会把所有的服务全杀掉,我只想杀掉测试完成后的那一个

—— 来自TesterHome官方 安卓客户端

websky #6 · July 11, 2016 作者

#2楼 @quqing 怎样才能模拟ctrl+c结束服务呢?


如图, 结束标题开头为 c:\ 的命令行窗口

这样就行了,你开启服务的时候 把端口保存下来,然后结束的时候先

netstat -aon | findstr 端口号

通过上面的命令获取到进程的pid,然后通过

taskkill -f -pid 进程的pid

就可以了。

基于楼上的答案,这里封装为一个方法如下:

def kill_appiumServer(self,port):

#查找对应端口的pid
cmd_find='netstat -aon | findstr %s' %port
print(cmd_find)

result = os.popen(cmd_find)
text = result.read()
pid=text[-5:-1]

#执行被占用端口的pid
cmd_kill='taskkill -f -pid %s' %pid
print(cmd_kill)
os.popen(cmd_kill)
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up