【问题标题】:How to run infinte loop shell script from a java program如何从java程序运行无限循环shell脚本
【发布时间】:2014-10-10 17:12:18
【问题描述】:

我想从 java 程序运行一个 shell 脚本。当我在终端中运行我的 shell 脚本(loop_shell.sh)时,它运行良好,甚至我的 Java 程序(Execute.java)在运行其他命令(如“ls”等)时运行良好。但是当我尝试运行 shell 脚本时Java 程序,shell 脚本不打印循环内的值。这里分别是shell脚本和Java程序的代码。

loop_shell.sh:-

 #bin/sh

i=0

j=0

timer=0;

echo "u r in loop_shell.sh"

while((i!=1));

do

 echo "waiting for the folder" 

done

Execute.java:-

import java.io.BufferedReader;

   import java.io.IOException;

   import java.io.InputStream;

   import java.io.InputStreamReader;

   import java.io.File;



   public class Execute
   {

    public static void main (String args[])
    {

     String command="./loop_shell.sh";

     String output=executeCommand1(command);

     System.out.println(output);
    }
        public static String executeCommand1(String command) {

            StringBuffer output = new StringBuffer();

            Process p;

            try {
                File dir = new File("/home/vamz/Desktop/sudhir_personal/JAVA_IMPORTANT/");//path
                p = Runtime.getRuntime().exec(command,null,dir);
                p.waitFor();
                BufferedReader reader = 
                            new BufferedReader(new InputStreamReader(p.getInputStream()));

                            String line = "";           
                while ((line = reader.readLine())!= null) {
                output.append(line + "\n");
                }

            } catch (Exception e) {
        e.printStackTrace();
        }

    return output.toString();

    }

  }

输出:- u r in loop_shell.sh

预期输出:-

 u r in loop_shell.sh
 u r in loop_shell.sh
 u r in loop_shell.sh
 u r in loop_shell.sh
 u r in loop_shell.sh
 u r in loop_shell.sh
 ..........so on ....

如果您尝试运行这两个程序,您将获得相同的输出。你可以看到输出只是打印“你在 loop_shell.sh 中”并且 qutting 没有等待 shell 脚本完成! 有人可以解释一下发生了什么吗?并请告诉我如何从 java 程序运行无限循环脚本。

【问题讨论】:

    标签: java linux bash shell


    【解决方案1】:

    在互联网上搜索并长时间挠头后,我找到了从 java 程序运行无限循环 shell 脚本的正确方法。我的 java 程序必须是这样的:-

    import java.io.BufferedReader;
    
       import java.io.IOException;
    
       import java.io.InputStream;
    
       import java.io.InputStreamReader;
    
       import java.io.File;
    
    
    
       public class Execute
       {
    
        public static void main (String args[])
        {
    
         String command="/bin/bash loop_shell.sh"; ----> change in shell command!
    
         String output=executeCommand1(command);
    
         System.out.println(output);
        }
            public static String executeCommand1(String command) {
    
                StringBuffer output = new StringBuffer();
    
                Process p;
    
                try {
                    File dir = new File("/home/vamz/Desktop/sudhir_personal/JAVA_IMPORTANT/");//path
                    p = Runtime.getRuntime().exec(command,null,dir);
                    p.waitFor();
                    BufferedReader reader = 
                                new BufferedReader(new InputStreamReader(p.getInputStream()));
    
                                String line = "";           
                    while ((line = reader.readLine())!= null) {
                    output.append(line + "\n");
                    }
    
                } catch (Exception e) {
            e.printStackTrace();
            }
    
        return output.toString();
    
        }
    
      }
    

    如您所见,bash 命令必须是这样的“/bin/bash/loop_shell.sh”。现在我的 java 程序正在等待 shell 脚本完成!!

    【讨论】:

    • 有没有办法从 java 运行无限循环的 shell 脚本?如果是请分享!!
    【解决方案2】:

    这是一个无限循环,您正在调用“p.waitFor()”,它会等待命令完成。这就是问题所在,只要让脚本完成,你就会看到结果。

    将脚本更改为:

    i=0
    
    j=0
    
    timer=0;
    
     echo "u r in loop_shell.sh"
    
    while((i!=10));
    
    do
    
        echo "waiting for the folder" 
        let i=i+1
    done
    

    【讨论】:

    • 感谢 Celeb 的回答!!您没有回答我的问题“如何从 java 程序运行无限循环 shell 脚本?”。你想说我们不能从 Java 程序运行无限循环 shell?
    • 如果问题出在 p.waitFor() 上,我的 java 程序必须无限期地等待。但它不会像那样发生。它只是在打印“u r in loop_shell.sh”后退出。如果你尝试运行这两个程序,你可以看到!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多