【问题标题】:Why does the below code stop with exit 1?为什么下面的代码在出口 1 处停止?
【发布时间】:2014-07-21 12:29:16
【问题描述】:

我尝试使用以下代码执行 Linux 命令。但它没有给出输出,只是打印出口 1。当我在 Linux 终端上执行命令时,它给出了输出。当通过 Java 执行时,它给出了错误。请建议。

JButton btnRunningtime = new JButton("RunningTime");
    btnRunningtime.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            try{
                textArea.setText("");
                String s2=comboBox.getSelectedItem().toString();
                 p = Runtime.getRuntime().exec("ps -eo pid,comm,cmd,start,etime | grep -i "+s2);
                 BufferedReader br = new BufferedReader(
                     new InputStreamReader(p.getInputStream()));
                 while ((s = br.readLine()) != null)
                 {
                     textArea.append(s+"\n");
                     System.out.println("Running time "+s);
                 }
                 p.waitFor();
                 System.out.println ("exit: " + p.exitValue());
                 p.destroy();
                 }
             catch(Exception e)
             {
                 System.out.println("Exception "+e);
             }
        }
    });
    btnRunningtime.setBounds(409, 211, 104, 27);
    contentPane.add(btnRunningtime);

【问题讨论】:

  • .When execute through Java it gives error 哪个错误/异常?
  • 或者一般来说,复制/粘贴程序的输出。
  • @TAsk 这就是我得到的所有输出出口:1
  • @Rogue 这是我的输出:exit: 1 当我在 p = Runtime.getRuntime().exec("ps -eo pid,comm,cmd,start,etime | grep -i "+s2);行,测试确实被打印出来。所以直到那一行没有错误
  • 那么这看起来运行良好。您打印出“exit: 1”,1 是您命令的状态。您是否尝试过自己运行命令?

标签: java linux bash ubuntu sh


【解决方案1】:

您还需要从进程中读取错误,

使用此代码

p = Runtime.getRuntime().exec("ps -eo pid,comm,cmd,start,etime | grep -i "+s2);
BufferedReader br = new BufferedReader(
new InputStreamReader(p.getErrorStream()));

最好的方法是同时读取 getInputStream 和 getErrorStream 您可以为每个流启动一个线程以读取该进程的所有响应。 我想你会知道发生了什么。

如果它在您当前的代码中没有到达这一行 s = br.readLine() 那是因为那里没有发送数据, 我认为数据被重定向到错误流,因为发生了错误

编辑:

关于错误,我认为是因为传递给命令的参数 我认为您需要将它们更改为字符串数组

.exec(new String[]{"ps","-eo","pid,comm,...","|","grep",...});

虽然我不确定能否通过 |作为参数,或其他方式

【讨论】:

    【解决方案2】:

    Java 的 Runtime.exec 方法不会调用 shell 来执行命令(因此它不同于标准 C 的 system 调用,例如)。您尝试传递给exec 的命令是一个shell 命令,而不是一个简单的可执行进程,您需要一个shell 才能使其工作。

    你需要exec 类似于数组:

    ["sh", "-c", "ps -eo pid,comm,cmd,start,etime | grep -i "+s2]
    

    虽然您可能必须将第一个参数指定为 "/bin/sh"

    【讨论】:

    • +1, 是的,在 windows 中你必须通过 "cmd.exe" , ... 来执行诸如 'dir' 之类的命令
    • @rici 它是这样工作的!!!但我仍然不明白原因。你说过不能以这种方式执行 shell 命令。但后来我执行了 ps -A -o pid,pmap,xlsclients 和 bash /home/user/Desktop/script 之类的命令.那些工作的原因是什么?请指教。
    • @user3680477:大多数简单的 shell 命令都包含一个程序名称(如ps),后跟一个以空格分隔的参数列表。 Java 的 Runtime.exec 非常聪明,可以将字符串拆分为程序名称和以空格分隔的参数列表,并调用将执行命令的操作系统函数。外壳要聪明得多。它可以处理重定向(><),它可以同时执行多个程序,将一个程序的输出传递给另一个程序的输入。 Runtime.exec 并不那么聪明。所以如果你需要这些东西,你需要运行一个 shell。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2011-04-06
    • 2011-05-01
    • 2016-04-19
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多