1.问题

在最近做的项目当中,需要用Java调用基于python写的两个不同的模型运行并且得到实验结果:

1.在服务器上运行的文本识别模型

2.在本地Ubuntu中annacoda 虚拟环境中运行的影像识别模型

由于两个模型都是在终端执行,于是考虑用java代码直接调起终端,然后让终端执行指定的shell命令,测试代码如第二节;

由于模型的启动模型在不同的项目路径下,这种情况下指令需要好几条,有点繁琐,于是写了一个脚本,考虑用java直接调用shell脚本;

2.java调用shell命令

1.在实际项目当中,如果指令比较简单,可以直接把需要执行的指令传到Runtime.getRuntime().exec()中的参数。百度之后发现exec()有如下几种参数:

cmdarray: 包含所调用命令及其参数的数组。

command: 一条指定的系统命令。

envp: 字符串数组,其中每个元素的环境变量的设置格式为name=value;如果子进程应该继承当前进程的环境,则该参数为 null。

dir: 子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为 null。

Process exec(String command)
在单独的进程中执行指定的字符串命令。   Process exec(String[] cmdarray)
在单独的进程中执行指定命令和变量。   --不指定环境即默认环境Process exec(String[] cmdarray, String[] envp)
在指定环境的独立进程中执行指定命令和变量。   Process exec(String[] cmdarray, String[] envp, File dir)
在指定环境和工作目录的独立进程中执行指定的命令和变量。   Process exec(String command, String[] envp)
在指定环境的单独进程中执行指定的字符串命令。   Process exec(String command, String[] envp, File dir)
在有指定环境和工作目录的独立进程中执行指定的字符串命令。复制代码

添加依赖包:

<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.50</version></dependency>
复制代码

代码:ls;pwd

public void runPicmodels() {try {String shpath = "/home/hzhao/project_bj";String[] params = new String[] { "/bin/sh", "-c", "ls;pwd"};Process ps=Runtime.getRuntime().exec(params);ps.waitFor();BufferedReader bufrIn = new BufferedReader(new InputStreamReader(ps.getInputStream(), "UTF-8"));BufferedReader bufrError = new BufferedReader(new InputStreamReader(ps.getErrorStream(), "UTF-8"));// 读取输出 result是shell中的输出StringBuilder result = new StringBuilder();String line = null;while ((line = bufrIn.readLine()) != null || (line = bufrError.readLine()) != null) {result.append(line).append('\n');}System.out.println(result);} catch (Exception e) {e.printStackTrace();}}
复制代码

需要注意的是,在调用时需要执行waitFor()函数,因为shell进程是JAVA进程的子进程,JAVA作为父进程需要等待子进程执行完毕。

3.java调用shell脚本

1.写shell脚本---测试脚本

#!/usr/bin/sh
python /home/hzhao/sys.py
source activate zh_py35
cd /home/hzhao/project_bj/detection_pub
pwd
python /home/hzhao/sys.py
echo ------running-------
python __main__.pyc
echo ------success-------复制代码

2.调用shell脚本:exec函数,参数编程shell文件,可以添加参数;


import java.io.BufferedReader;
import java.io.InputStreamReader; public class RunShell { public static void main(String[] args){ try { String shpath="/home/hzhao/Project/note.sh"; Process ps = Runtime.getRuntime().exec(shpath); ps.waitFor(); BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream())); StringBuffer sb = new StringBuffer(); String line; while ((line = brreadLine()) != null) { sb.append(line).append("\n"); } String result = sbtoString(); System.out.println(result); }  catch (Exception e) { e.printStackTrace(); } }
} 复制代码

4.总结

1.ProcessBuilder
2.Runtime

3.读缓冲区:因为shell脚本有时候有echo输出或打印,导致缓冲区被用完了,为了避免这种情况,需要用将缓冲区数据读出来。同时可以打印shell具体运行状态。

BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream())); StringBuffer sb = new StringBuffer(); String line; while ((line = brreadLine()) != null) { sb.append(line).append("\n"); } String result = sbtoString(); System.out.println(result);
复制代码

4.因为其中一个模型只能运行在本地annacoda虚拟环境中,而java调用的时候总是不能通过source activate 激活这个环境。 后面以为是环境变量路径没有配置的问题,尝试在envp中添加环境变量,失败; 查找网络之后,发现原来java在调用shell的时候,默认用的是系统/bin/下的指令。特别是你用root权限运行的时候。 这时候,你要在/bin下加软链了。针对我上面的例子,就要在/bin下加软链。--这个未尝试。后面封装服务解决。

转载于:https://juejin.im/post/5d071b4251882513cc52fee2

java操作Linux 调用shell命令,shell脚本相关推荐

  1. Java - 调用 Shell 命令和脚本

    介绍 有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本.而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRunt ...

  2. Hadoop概念学习系列之Java调用Shell命令和脚本,致力于hadoop/spark集群(三十六)...

    第一种:普通做法 首先,编号写WordCount.scala程序.  然后,打成jar包,命名为WC.jar.比如,我这里,是导出到windows桌面.  其次,上传到linux的桌面,再移动到hdf ...

  3. java操作linux命令

    java命令操作linux指令 参考 import java.io.*; public class Test{public static void main(String[] args) throws ...

  4. java jsch jar_基于Jsch实现Java操作linux服务器

    [概述] 如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉.ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接.ssh在连接和传送的过程中会加密所有的数据.但是ss ...

  5. java基础/java调用shell命令和脚本

    一.项目需求: 从某一机构获取证书,证书机构提供小工具,执行.sh脚本即可启动服务,本地调用该服务即可获取证书. 问题:linux服务器启动该服务,不能关闭.一旦关闭,服务即停止. 解决方案:java ...

  6. Java操作linux脚本

    近期在实现Java调用linux命令及脚本实现数据的批处理,文件的生成,下面记录下我所有遇见的问题 1.sqlplus ip等配置 1.sqlplus username/password 连接本机数据 ...

  7. linux下超强命令(shell语句)组合

    记性很差劲,经常在系统,网络之间转,没有专搞系统.时间一长,所以难免有些命令或组合式语句忘记了,今天把它们集合到一起,以后跑博客上找就是了,陆续更新中... 服务器双网卡,双IP,第二个网卡路由设置格 ...

  8. linux常用的命令shell,Linux操作系统Shell和常用命令汇总

    简述 本文主要介绍Shell和Linux常用命令. Shell Shell 是一个用 C 语言编写的应用程序,提供了用户访问Linux操作系统内核服务的界面,它可以用来启动.挂起.停止.编写程序.Sh ...

  9. java版本streamgobbler_java调用本地命令 Runtime class's exec() method

    一个简单的定时调用dos命令的例子 2, ExecJavac.java 带有异常处理的命令调用例子 3, GoodWindowsExec.java 执行windows下的命令,命令作为参数输入 Str ...

最新文章

  1. 网站关键词优化从这几方面下手效果会更好!
  2. 高退出低留存:六年百万数据透析,想颠覆传统教育的MOOC怎么了?
  3. 杭电oj1087最长递增子序列java实现
  4. liferay jsp如何取PorletSession的值
  5. 修改oracle归档目录和大小
  6. Mac系统下Homebrew的安装和使用Homebrew安装python
  7. Kafka基本知识整理
  8. php 不同时区时间转换,在PHP中将DateTime字符串转换为不同的时区
  9. android 刷新view位置,Android View刷新机制实例分析
  10. 一起走过一段不平凡的路
  11. 【Kubernetes】mac 安装minikube
  12. Mac版MySQL安装和登陆
  13. 2.3 Hightway Networks
  14. 艾默生Ovation DCS OPC服务分析
  15. android 空调遥控,安卓版万能空调遥控器
  16. xp计算机图标,xp我的计算机图标不见了
  17. pandas中关于nan的处理
  18. STM32 Flash读写;Flash地址对应的存储内容及方式;
  19. 苹果待处理订单要多久_一个订单管理系统帮你轻松应对复杂的生产订单管理
  20. 计算机科学的发展表情包,表情包发展简史

热门文章

  1. python计算速度_python中如何提高计算速度?
  2. layui搭建的php后台,使用layui框架搭建后台布局
  3. netty半包粘包 处理_老王:Netty到底是个什么鬼?有没有简单的理解方式?
  4. STM32的printf函数重定向
  5. php表单实现分页,**PHP分步表单提交思路(分页表单提交)
  6. spark sql 数据类型转换_spark dataframe 类型转换
  7. go语言struct各种定义和用法
  8. 为什么css导航右边有黑色,一段CSS的导航菜单,为什么有了这个左导航之后,右面的区域用不了了...
  9. oracle的逻辑结构包括,oracle逻辑结构分析
  10. java 泛型 类型形参(Type Parameters)Type Parameters 边界(Bound) 类型