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

我试着用下面的代码执行一个Linux命令,但是它不会给输出打印出口1.当我在Linuxterminal上执行命令时给出输出。当通过Java执行时,它给出了错误。请教build议。

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); 

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

你所需要的exec就像数组一样:

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

尽管可能需要将第一个参数指定为"/bin/sh"

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

使用这个代码

 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",...}); 

虽然我不知道传递| 作为参数,或者其他方式