Java的如何停止在节目之前推出的shell脚本(Java how to stop shell sc

2019-09-30 08:00发布

我创建了一个服务器程序,当收到某些命令,执行一些动作。 当它接收到命令“机器人”(当客户端从一个Android设备连接这恰好),我的服务器启动一个shell脚本,当客户端断开连接,我想它停止该脚本的执行,我想。

此外,当Web浏览器客户端连接,并发送命令“浏览器”服务器将推出的其他脚本。

这两个脚本无法在同一时间使用,因为它们使用相同的资源。 这就是为什么我必须阻止他们时,一个客户端断开连接(我知道,我不能有两种类型,同时连接的客户端)。

现在,我已经能够启动脚本,而不是阻止他们。 下面是在服务器运行我的方法的代码:

@Override
public void run() {
    try {
        BufferedReader ins = new BufferedReader(new InputStreamReader(soc.getInputStream()));

        Runtime r = Runtime.getRuntime();
        Process p = null;

        int i = 0;
        while (i < 1) {
            String request = ins.readLine();
            if (request == null || request.equals("close")) {
                p.destroy();
                System.out.println("The child was destroyed? "+p.exitValue());
                i++;
            }
            else {
                if (request.equals("android")) {
                    p = r.exec("sh /home/pi/test-raspicamsrc.sh &");
                }
                else if (request.equals("browser")) {
                    p = r.exec("sh /home/pi/test-http-launch.sh &");
                }
                else if (request.equals("left")) {
                    serialPort.writeBytes("4".getBytes());//Write data to port
                }
                else if (request.equals("right")) {
                    serialPort.writeBytes("6".getBytes());
                }
                else if (request.equals("stop")) {
                    serialPort.writeBytes("5".getBytes());
                }
                else if (request.equals("forward")) {
                    serialPort.writeBytes("8".getBytes());
                }
                else if (request.equals("backward")) {
                    serialPort.writeBytes("2".getBytes());
                }
                else {
                    System.out.println("Unknown command");
                }
            }
        }
        ins.close();
        soc.close();
        // We always stop the car in the end.
        serialPort.writeBytes("5".getBytes());
    }

第一次断开一个机器人设备,输出p.exitValue()143 ,和脚本执行保持。 之后,如果我一个更多的时间与Android客户端连接它似乎并没有再次启动脚本(这是一件好事,我不知道为什么,也许它不会推出,但由于资源已在使用,它关闭速度非常快),当我拔下这个新的客户端p.exitValue()返回0 。 这是因为该过程不存在正常的事情。 但在此期间推出了第一个剧本的过程中保持运行。

我想知道为什么我的命令p.destroy()不杀我的脚本程序。 我想这可能是因为它停止SH过程,但不是我的剧本的过程中(两个不同的过程)喜欢这里有点Java进程停止整个进程树

我希望有解决这个问题,谢谢大家的方式! :)

Answer 1:

你可以检查你的脚本由下面的命令运行,或者是服务器。

PS -efw | grep '可以PROCESS_NAME'

现在停止从您可以下面的命令执行java程序脚本。

pkill的-9 -f 'test-raspicamsrc.sh'

pkill的命令用于杀死通过提供处理模式的过程。 如果你想杀死无PID你可以执行像下面Firefox的应用程序。

pkill的-9 -f '火狐'



Answer 2:

好,我找到了如何使它发挥作用。 其实我不得不使用pkill ,但在我的脚本执行的命令的进程的名称。 此外,我不得不改变我在Java中执行命令的方式。 因为发射pkill -9 -f 'gst-launch-1.0'在壳体正确地停止脚本,但在Java代码killProcess = r.exec("pkill -9 -f 'gst-launch-1.0'"); 是uneffective。 所以我改变通过这种方式执行壳命令的方式: killProcess = r.exec(new String[]{"bash","-c","pkill -9 -f 'gst-launch-1.0'"}); (根据这个话题: 要调用从Java Linux shell命令 )

所以这是我工作的代码:

@Override
    public void run() {
        try {
            BufferedReader ins = new BufferedReader(new InputStreamReader(soc.getInputStream()));

            Runtime r = Runtime.getRuntime();
            Process videoProcess = null;
            Process killProcess = null;
            boolean android = false;

            int i = 0;
            while (i < 1) {
                String request = ins.readLine();

                if (request == null || request.equals("close")) {
                    if (android) {
                        killProcess = r.exec(new String[]{"bash","-c","pkill -9 -f 'gst-launch-1.0'"});
                    }
                    else {
                        killProcess = r.exec(new String[]{"bash","-c","pkill -9 -f 'http-launch'"});
                    }
                    i++;
                }
                else {
                    if (request.equals("android")) {
                        videoProcess = r.exec(new String[]{"bash","-c","sh /home/pi/test-raspicamsrc.sh"});
                        android = true;
                    }
                    else if (request.equals("browser")) {
                        videoProcess = r.exec(new String[]{"bash","-c","sh /home/pi/test-http-launch.sh"});
                        android = false;
                    }
                    else if (request.equals("left")) {
                        serialPort.writeBytes("4".getBytes());//Write data to port
                    }
                    else if (request.equals("right")) {
                        serialPort.writeBytes("6".getBytes());
                    }
                    else if (request.equals("stop")) {
                        serialPort.writeBytes("5".getBytes());
                    }
                    else if (request.equals("forward")) {
                        serialPort.writeBytes("8".getBytes());
                    }
                    else if (request.equals("backward")) {
                        serialPort.writeBytes("2".getBytes());
                    }
                    else {
                        System.out.println("Unknown command");
                    }
                }
            }
            ins.close();
            soc.close();
            // We always stop the car in the end.
            serialPort.writeBytes("5".getBytes());

        }
        catch (IOException e) {
            System.out.println("Error input/output while initializing the server (Port 6020 may already be in use)");
        }
    }


文章来源: Java how to stop shell script launched previously in the program