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

websky · 2016年07月08日 · 最后由 Sutune 回复于 2018年01月22日 · 2995 次阅读

我用 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 /?

#3 楼 @watman

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

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

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

#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)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册