我试着用下面的代码执行一个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",...});
虽然我不知道传递| 作为参数,或者其他方式