为什么以下代码在退出1时停止?

时间:2014-06-01 04:20:58

标签: java linux bash ubuntu sh

我尝试使用下面的代码执行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);

2 个答案:

答案 0 :(得分: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 :(得分: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()行 那是因为没有数据发送到那里, 我认为数据被重定向到错误流,因为发生了错误

修改

关于错误,我认为这是因为传递给命令的参数 我认为你需要将它们改成一个String数组

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

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