我尝试使用下面的代码执行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);
答案 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",...});
虽然我不确定通过|作为参数,或其他方式