java调取linux系统执行python命令

最近遇到一个需求,python写了一个识别图片的程序,java需要调用它,网上百度很多调取linux的命令的方式,发布到linux都正常,但是我的java程序做成了服务,开机自启那种,然后就遇到了令人费解的问题,java -jar 命令行测试的识别程序都好使,发布成服务就一直不好使,折磨了我两天,各种代码来回测试找原因,最终找到原因不是出在代码上,而是conda的环境上。

众所周知,运行python代码需要有python的环境,我是用的anaconda,在普通用户下安装了conda,配置了各种环境变量,正常运行linux命令也都没问题,但是我忽略了一点,服务启动java程序是以root身份启动的,所以执行python程序一直不成功。根本原因是root用户下没有conda环境。不信的话可以试试,在普通用户下输入su,就可以切换成root用户。

如上图所示,普通用户下是有python环境的,而我切换成root是没有的,问题就出在这里。在root用户下执行java程序python是识别失败的。

java调取linux系统执行python命令_第1张图片

我们要把普通用户的conda环境让root用户也正常使用才可以。在conda环境我们写的python语句才能生效。

步骤:

1.切换root用户 输入su命令

2.在root命令下执行  一般用户下的conda环境,如下我的一般用户是user1

source /home/user1/anaconda3/bin/activate

这样就可以激活anaconda3的默认环境 base,可以看到root前有(base)式样

3.这样并不是一劳永逸的,当我们切换回普通用户时又会没有conda的环境了

java调取linux系统执行python命令_第2张图片

我们想让root默认就进入conda的base环境只需在root用户下对conda进行初始化即可,命令如下:

conda init,执行命令后可以发现root用户下的/.bashrc被修改

java调取linux系统执行python命令_第3张图片

4.我们再次使用su user1等切换普通用户,再切回root用户base环境都没有消失。

5.sudo systemctl start java服务,就可以正常调取python识别程序啦。

java调取linux系统执行python命令_第4张图片

最后。我发现如果你们的java程序不是做成服务的话,直接使用nohup java -jar执行的也没有太大的影响,就是不能开机自启动,如何衡量大家可以看自身需要吧。

我的程序调用linux程序代码如下:

 public Integer execLinux(String cmdStr) {
        log.info("===cmd语句==");
        log.info(cmdStr);
        final StringBuilder str = new StringBuilder();
        final Runtime runtime = Runtime.getRuntime();
        if (runtime == null) {
            return 0;
        }
        String[] cmdStr1 = new String[]{"/bin/bash", "-c", cmdStr};
        Process pro = null;
        BufferedReader input = null;
        PrintWriter writer = null;
        BufferedReader errorReader = null;
        try {
            pro = runtime.exec(cmdStr1);
            input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
            writer = new PrintWriter(new OutputStreamWriter(pro.getOutputStream()));
            errorReader = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
            String line;
            while ((line = input.readLine()) != null) {
                str.append(line).append("\n");
//                strList.add(line);
            }
            while ((line = errorReader.readLine()) != null) {
                log.error("错误结果");
                System.out.println(line);
            }

        } catch (IOException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (errorReader != null) {
                    errorReader.close();
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
            try {
                if (input != null) {
                    input.close();
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
            if (writer != null) {
                writer.close();
            }
            if (pro != null) {
                pro.destroy();
            }

        }
        if (cmdStr.indexOf("rm -rf ") > -1) {
            return 0;
        }
        log.info("===linux命令输出文本===");
        log.info(str.toString());
        if (str.indexOf("Done.") > -1) {
            log.info("=======success=====");
            return 1;
        } else {
            log.info("=======error=====");
            return 0;
        }
    }

或者

    public static Integer shell1(String cmdStr) {
        log.info("=====shell1------");
        String[] cmdStr1 = new String[]{"/bin/sh", "-c", cmdStr};
        Process process = null;
        BufferedReader input = null;
        String user = "";
        try {
            process = Runtime.getRuntime().exec(cmdStr1);
            process.waitFor();
            int result = process.exitValue();                 //为0表示执行成功,非0表示shell执行出错
            input = new BufferedReader(new InputStreamReader(process.getInputStream()));
            log.info("=====result------");
            log.info(result + "");
            return result == 0 ? 1 : 0;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
            //异常操作
        } finally {
            //销毁process(process.destroy())以及关闭流
        }

    }

仅以此文祭奠下我两天的脑细胞,哈哈哈!

你可能感兴趣的:(python,java,linux)