java操作Linux 调用shell命令,shell脚本
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脚本相关推荐
- Java - 调用 Shell 命令和脚本
介绍 有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本.而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRunt ...
- Hadoop概念学习系列之Java调用Shell命令和脚本,致力于hadoop/spark集群(三十六)...
第一种:普通做法 首先,编号写WordCount.scala程序. 然后,打成jar包,命名为WC.jar.比如,我这里,是导出到windows桌面. 其次,上传到linux的桌面,再移动到hdf ...
- java操作linux命令
java命令操作linux指令 参考 import java.io.*; public class Test{public static void main(String[] args) throws ...
- java jsch jar_基于Jsch实现Java操作linux服务器
[概述] 如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉.ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接.ssh在连接和传送的过程中会加密所有的数据.但是ss ...
- java基础/java调用shell命令和脚本
一.项目需求: 从某一机构获取证书,证书机构提供小工具,执行.sh脚本即可启动服务,本地调用该服务即可获取证书. 问题:linux服务器启动该服务,不能关闭.一旦关闭,服务即停止. 解决方案:java ...
- Java操作linux脚本
近期在实现Java调用linux命令及脚本实现数据的批处理,文件的生成,下面记录下我所有遇见的问题 1.sqlplus ip等配置 1.sqlplus username/password 连接本机数据 ...
- linux下超强命令(shell语句)组合
记性很差劲,经常在系统,网络之间转,没有专搞系统.时间一长,所以难免有些命令或组合式语句忘记了,今天把它们集合到一起,以后跑博客上找就是了,陆续更新中... 服务器双网卡,双IP,第二个网卡路由设置格 ...
- linux常用的命令shell,Linux操作系统Shell和常用命令汇总
简述 本文主要介绍Shell和Linux常用命令. Shell Shell 是一个用 C 语言编写的应用程序,提供了用户访问Linux操作系统内核服务的界面,它可以用来启动.挂起.停止.编写程序.Sh ...
- java版本streamgobbler_java调用本地命令 Runtime class's exec() method
一个简单的定时调用dos命令的例子 2, ExecJavac.java 带有异常处理的命令调用例子 3, GoodWindowsExec.java 执行windows下的命令,命令作为参数输入 Str ...
最新文章
- 网站关键词优化从这几方面下手效果会更好!
- 高退出低留存:六年百万数据透析,想颠覆传统教育的MOOC怎么了?
- 杭电oj1087最长递增子序列java实现
- liferay jsp如何取PorletSession的值
- 修改oracle归档目录和大小
- Mac系统下Homebrew的安装和使用Homebrew安装python
- Kafka基本知识整理
- php 不同时区时间转换,在PHP中将DateTime字符串转换为不同的时区
- android 刷新view位置,Android View刷新机制实例分析
- 一起走过一段不平凡的路
- 【Kubernetes】mac 安装minikube
- Mac版MySQL安装和登陆
- 2.3 Hightway Networks
- 艾默生Ovation DCS OPC服务分析
- android 空调遥控,安卓版万能空调遥控器
- xp计算机图标,xp我的计算机图标不见了
- pandas中关于nan的处理
- STM32 Flash读写;Flash地址对应的存储内容及方式;
- 苹果待处理订单要多久_一个订单管理系统帮你轻松应对复杂的生产订单管理
- 计算机科学的发展表情包,表情包发展简史
热门文章
- python计算速度_python中如何提高计算速度?
- layui搭建的php后台,使用layui框架搭建后台布局
- netty半包粘包 处理_老王:Netty到底是个什么鬼?有没有简单的理解方式?
- STM32的printf函数重定向
- php表单实现分页,**PHP分步表单提交思路(分页表单提交)
- spark sql 数据类型转换_spark dataframe 类型转换
- go语言struct各种定义和用法
- 为什么css导航右边有黑色,一段CSS的导航菜单,为什么有了这个左导航之后,右面的区域用不了了...
- oracle的逻辑结构包括,oracle逻辑结构分析
- java 泛型 类型形参(Type Parameters)Type Parameters 边界(Bound) 类型