问题的提出:

  1. shell脚本要做离线的数据处理任务
  2. java调用脚本,将这种处理任务封装成webservice

特点

  1. shell处理单个时间长
  2. 每次要处理文件量大

这里目前只做调用分析:

原来的:

  1. private void runShell(String cmd){
  2. try{
  3.  
  4. logger.info("the command "+cmd);
  5. // create a process for the shell
  6. ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd);
  7. pb.redirectErrorStream(true); // use this to capture messages sent to stderr
  8. Process shell = pb.start();
  9. InputStream shellIn = shell.getInputStream(); // this captures the output from the command
  10. int shellExitStatus = 0;
  11. try {
  12. shellExitStatus = shell.waitFor();
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. } // wait for the shell to finish and get the return code
  16.  
  17. // // at this point you can process the output issued by the command
  18. // // for instance, this reads the output and writes it to System.out:
  19. int c;
  20. while ((c = shellIn.read()) != -1) {
  21. logger.info("shell read value:"+c);
  22. }
  23. // close the stream
  24. shellIn.close();
  25. logger.info(" *** End *** "+shellExitStatus);
  26.  
  27. logger.info("pb command "+pb.command());
  28. logger.info("pb command dir "+pb.directory());
  29. logger.info(pb.environment());
  30. logger.info(System.getenv());
  31. logger.info(System.getProperties());
  32. }
  33. catch (IOException ignoreMe)
  34. {
  35. ignoreMe.printStackTrace();
  36. }
  37. }

修改之后的代码:

  1. //变为成员变量方式
  2. protected volatile Process process;
  3.  
  4. private void runShell(String cmd) {
  5. try {
  6. logger.info("the command " + cmd);
  7. // create a process for the shell
  8. ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd);
  9. process = pb.start();
  10. final InputStream inputStream = process.getInputStream();
  11. final InputStream errorStream = process.getErrorStream();
  12. new Thread(new Runnable() {
  13. @Override
  14. public void run() {
  15. try{
  16. BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
  17. String line;
  18. while((line=reader.readLine())!=null){
  19. // logConsole(line);
  20. logger.debug(line);
  21. }
  22. }catch(Exception e){
  23. // log(e);
  24. e.printStackTrace();
  25. logger.debug("接收日志出错,推出日志接收");
  26. }
  27. }
  28. },"one").start();
  29. new Thread(new Runnable() {
  30. @Override
  31. public void run() {
  32. try {
  33. BufferedReader reader=new BufferedReader(new InputStreamReader(errorStream));
  34. String line;
  35. while((line=reader.readLine())!=null){
  36. // logConsole(line);
  37. logger.debug(line);
  38. }
  39. } catch (Exception e) {
  40. // log(e);
  41. e.printStackTrace();
  42. logger.debug("接收日志出错,推出日志接收");
  43. }
  44. }
  45. },"error").start();
  46. // InputStream shellIn = process.getInputStream(); // this captures the output from the command
  47. int shellExitStatus = 0;
  48. try {
  49. //等待程序结果
  50. shellExitStatus = process.waitFor();
  51. } catch (InterruptedException e) {
  52. e.printStackTrace();
  53. }finally{
  54. process=null;
  55. }
  56. } catch (IOException ignoreMe) {
  57. ignoreMe.printStackTrace();
  58. }
  59. }

实验结果:

同时处理100条语音。

第一个用时50min。

第二个用时25min。

优势:

  1. 使用processbuild 构造基于os的进程
  2. 使用process作为类变量并且使用volatile来进行描述

 

关于java调用linux shell 的问题的更多相关文章

  1. java 调用bash shell脚本阻塞的小问题的解决

    java  调用bash shell脚本阻塞的小问题的解决 背景 使用java实现的web端,web端相应用户的界面操作,使用java调用bash实现的shell脚本进行实际的操作,操作完成返回执行结 ...

  2. Java调用Linux命令(cd的处理)

    一.Java调用Linux系统的命令非常简单 这是一个非常常用的调用方法示例: public String executeLinuxCmd(String cmd) { System.out.print ...

  3. Java调用Linux命令执行

    调用方式 Java调用linux命令执行的方式有两种,一种是直接调用linux命令,一种是将linux命令写到.sh脚本中,然后调用脚本执行. 详细说明 直接调用:使用java中lang包下面的Run ...

  4. java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)

    java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...

  5. java调用linux下的so库

    1.编写java类 public class Abc { static { System.loadLibrary("abc"); } public native static St ...

  6. java调用Linux命令报错:java.io.IOException: Cannot run program "ps": CreateProcess error=2, ?????????

    在idea里面,java代码:Runtime.getRuntime().exec("ps -aux") 是因为默认是用windows平台运行了,所以报错,得改成调用Linux平台运 ...

  7. python 调用Linux shell

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...

  8. Java调用Linux下的shell命令并将结果以流的形式返回

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...

  9. python 之调用Linux shell命令及相关高级应用

    最近根据老大要求,将数据进行同步备份,结合第三方提供的工具.第三方服务其实是有python demo的,本想研究下实际的python sdk搞个demo开发的,但是发现有些组建装起来确实头大,而且本公 ...

随机推荐

  1. OC学习-1

    编译和编写代码. 1. 创建代码文件夹 mkdir lession2 2. 新建类文件 touch lession2.m 3. 打开编写代码,(会用xcode打开) open lession2.m 4 ...

  2. Delphi 7 里没有加载的控件

    在原来版本如D5.D6中使用的控件如Quickrep,FastNet等,在D7中仍然是保留的.只是Delphi没有将他们默认的安装到组件面版中来.这些控件包全部保存在Delphi目录的bin下,文件扩 ...

  3. ios 文件操作

    1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...

  4. oracle DML错误日志(笔记)

    DML错误日志是oracle10gR2引入的一个类似于SQL*Loader的错误日志功能.它的基本原理是把任何可能导致语句失败的记录转移,放到一张错误日志表中. 具体使用如下: 1.使用DBMS_ER ...

  5. OpenGL 纹理贴图

    前一节实例代码中有个贴图操作. 今天就简单说明一下纹理贴图... 为了使用纹理贴图.我们首先需要启用纹理贴图功能. 我们可以在Renderer实现的onSurfaceCreated中定义启用: // ...

  6. 3.Knockout.Js(属性绑定)

    前言 让visible绑定到DOM元素上,使得该元素的hidden或visible取决于绑定的值. 简单的绑定 首先还是先定义一个ViewModel var AppViewModel = { shou ...

  7. Python实现DBScan

    Python实现DBScan 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=>end: 结束 ...

  8. Android实现入门界面布局

    Android实现入门界面布局 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 首先是常量的定义,安卓中固定字符串应该定义在常量中. stri ...

  9. DSP28335矩阵键盘的检测

    #include "DSP2833x_Device.h"#include "DSP2833x_Examples.h"char temp;void gpio_in ...

  10. [shell基础]——read命令

    read命令:在shell中主要用于读取输入.变量.文本 1. 接受标准输入(键盘)的输入,并将输入的数据赋值给设置的变量      [按回车键——表示输入完毕]      [若输入的数据多于设置的变 ...