我想知道所有不同运行的 JVM 加载了哪些 jar。
如果我输入 “lsof -p $PID | grep jar >>/somefile” 从 bash/命令,它工作得很漂亮! (用实际进程 ID 替换 $PID)。但是,我希望能够从 Java 程序中执行此操作。 我希望下面的代码可以工作,但没有文件被写入:
public static void printCustomCommand(){
String[] pids = {"pidof java"};
String s;
try {
Process pidProcess = Runtime.getRuntime().exec("pidof java");
BufferedReader br = new BufferedReader(new InputStreamReader(pidProcess.getInputStream()));
pids = br.readLine().split(" ");
for (String pid : pids){
String cmd = "lsof -p " + pid + " | grep jar >> /somepath/mydumpfile";
Process p;
p = Runtime.getRuntime().exec(cmd);
System.out.println(p.waitFor());
}
//pids = new String(bo).split(" ");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
当我打印 p.waitFor() 命令时,它总是返回 1,这意味着根据 API 文档“有些东西不正确”。 http://docs.oracle.com/javase/6/docs/api/java/lang/Process.html#waitFor%28%29
最佳答案
问题是 Runtime.exec() 不理解“|”等 shell 概念。 试试这个:
public static void printCustomCommand(){
String[] pids = {"pidof java"};
String s;
try {
Process pidProcess = Runtime.getRuntime().exec("/bin/bash -c pidof java");
BufferedReader br = new BufferedReader(new InputStreamReader(pidProcess.getInputStream()));
pids = br.readLine().split(" ");
for (String pid : pids){
String cmd = "/bin/bash -c lsof -p " + pid + " | grep jar >> /somepath/mydumpfile";
Process p;
p = Runtime.getRuntime().exec(cmd);
BufferedReader reader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while((line = reader.readLine()) != null) {
System.out.print(line + "\n");
}
p.waitFor();
}
//pids = new String(bo).split(" ");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
问题是 exec 直接运行二进制文件而不调用 shell。 “|”字符只能被 shell 识别。 “-c”告诉 shell 运行单个命令,并将整个命令作为单个参数传递。
关于java - Java 中的 Linux 命令 "write all used jars by JVM to file",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25030212/