关于java调用linux shell 的问题
问题的提出:
- shell脚本要做离线的数据处理任务
- java调用脚本,将这种处理任务封装成webservice
特点:
- shell处理单个时间长
- 每次要处理文件量大
这里目前只做调用分析:
原来的:
- private void runShell(String cmd){
- try{
- logger.info("the command "+cmd);
- // create a process for the shell
- ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd);
- pb.redirectErrorStream(true); // use this to capture messages sent to stderr
- Process shell = pb.start();
- InputStream shellIn = shell.getInputStream(); // this captures the output from the command
- int shellExitStatus = 0;
- try {
- shellExitStatus = shell.waitFor();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } // wait for the shell to finish and get the return code
- // // at this point you can process the output issued by the command
- // // for instance, this reads the output and writes it to System.out:
- int c;
- while ((c = shellIn.read()) != -1) {
- logger.info("shell read value:"+c);
- }
- // close the stream
- shellIn.close();
- logger.info(" *** End *** "+shellExitStatus);
- logger.info("pb command "+pb.command());
- logger.info("pb command dir "+pb.directory());
- logger.info(pb.environment());
- logger.info(System.getenv());
- logger.info(System.getProperties());
- }
- catch (IOException ignoreMe)
- {
- ignoreMe.printStackTrace();
- }
- }
修改之后的代码:
- //变为成员变量方式
- protected volatile Process process;
- private void runShell(String cmd) {
- try {
- logger.info("the command " + cmd);
- // create a process for the shell
- ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd);
- process = pb.start();
- final InputStream inputStream = process.getInputStream();
- final InputStream errorStream = process.getErrorStream();
- new Thread(new Runnable() {
- @Override
- public void run() {
- try{
- BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
- String line;
- while((line=reader.readLine())!=null){
- // logConsole(line);
- logger.debug(line);
- }
- }catch(Exception e){
- // log(e);
- e.printStackTrace();
- logger.debug("接收日志出错,推出日志接收");
- }
- }
- },"one").start();
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- BufferedReader reader=new BufferedReader(new InputStreamReader(errorStream));
- String line;
- while((line=reader.readLine())!=null){
- // logConsole(line);
- logger.debug(line);
- }
- } catch (Exception e) {
- // log(e);
- e.printStackTrace();
- logger.debug("接收日志出错,推出日志接收");
- }
- }
- },"error").start();
- // InputStream shellIn = process.getInputStream(); // this captures the output from the command
- int shellExitStatus = 0;
- try {
- //等待程序结果
- shellExitStatus = process.waitFor();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally{
- process=null;
- }
- } catch (IOException ignoreMe) {
- ignoreMe.printStackTrace();
- }
- }
实验结果:
同时处理100条语音。
第一个用时50min。
第二个用时25min。
优势:
- 使用processbuild 构造基于os的进程
- 使用process作为类变量并且使用volatile来进行描述
关于java调用linux shell 的问题的更多相关文章
- java 调用bash shell脚本阻塞的小问题的解决
java 调用bash shell脚本阻塞的小问题的解决 背景 使用java实现的web端,web端相应用户的界面操作,使用java调用bash实现的shell脚本进行实际的操作,操作完成返回执行结 ...
- Java调用Linux命令(cd的处理)
一.Java调用Linux系统的命令非常简单 这是一个非常常用的调用方法示例: public String executeLinuxCmd(String cmd) { System.out.print ...
- Java调用Linux命令执行
调用方式 Java调用linux命令执行的方式有两种,一种是直接调用linux命令,一种是将linux命令写到.sh脚本中,然后调用脚本执行. 详细说明 直接调用:使用java中lang包下面的Run ...
- java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)
java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...
- java调用linux下的so库
1.编写java类 public class Abc { static { System.loadLibrary("abc"); } public native static St ...
- java调用Linux命令报错:java.io.IOException: Cannot run program "ps": CreateProcess error=2, ?????????
在idea里面,java代码:Runtime.getRuntime().exec("ps -aux") 是因为默认是用windows平台运行了,所以报错,得改成调用Linux平台运 ...
- python 调用Linux shell
有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...
- Java调用Linux下的shell命令并将结果以流的形式返回
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...
- python 之调用Linux shell命令及相关高级应用
最近根据老大要求,将数据进行同步备份,结合第三方提供的工具.第三方服务其实是有python demo的,本想研究下实际的python sdk搞个demo开发的,但是发现有些组建装起来确实头大,而且本公 ...
随机推荐
- OC学习-1
编译和编写代码. 1. 创建代码文件夹 mkdir lession2 2. 新建类文件 touch lession2.m 3. 打开编写代码,(会用xcode打开) open lession2.m 4 ...
- Delphi 7 里没有加载的控件
在原来版本如D5.D6中使用的控件如Quickrep,FastNet等,在D7中仍然是保留的.只是Delphi没有将他们默认的安装到组件面版中来.这些控件包全部保存在Delphi目录的bin下,文件扩 ...
- ios 文件操作
1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...
- oracle DML错误日志(笔记)
DML错误日志是oracle10gR2引入的一个类似于SQL*Loader的错误日志功能.它的基本原理是把任何可能导致语句失败的记录转移,放到一张错误日志表中. 具体使用如下: 1.使用DBMS_ER ...
- OpenGL 纹理贴图
前一节实例代码中有个贴图操作. 今天就简单说明一下纹理贴图... 为了使用纹理贴图.我们首先需要启用纹理贴图功能. 我们可以在Renderer实现的onSurfaceCreated中定义启用: // ...
- 3.Knockout.Js(属性绑定)
前言 让visible绑定到DOM元素上,使得该元素的hidden或visible取决于绑定的值. 简单的绑定 首先还是先定义一个ViewModel var AppViewModel = { shou ...
- Python实现DBScan
Python实现DBScan 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=>end: 结束 ...
- Android实现入门界面布局
Android实现入门界面布局 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 首先是常量的定义,安卓中固定字符串应该定义在常量中. stri ...
- DSP28335矩阵键盘的检测
#include "DSP2833x_Device.h"#include "DSP2833x_Examples.h"char temp;void gpio_in ...
- [shell基础]——read命令
read命令:在shell中主要用于读取输入.变量.文本 1. 接受标准输入(键盘)的输入,并将输入的数据赋值给设置的变量 [按回车键——表示输入完毕] [若输入的数据多于设置的变 ...