java - Java 中的 Linux 命令 "write all used jars by JVM to file"

标签 java linux bash jvm

我想知道所有不同运行的 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/

相关文章:

java - 如何将捕获的图像路径从imageview保存到mysql数据库

java - 为什么我的 List<Long> 包含整数?

linux - 从wget下载时如何更改文件名?

c - 有没有办法将 '-lm' 设置为 GCC 的默认值?

linux - 这个脚本中发生了什么?

mysql - 为什么从 mysql 获取输出时这个 bash 变量为空?

java - junitparameter异常方法应该没有参数

Java double 在条件中不正确比较

Linux/SVN 烦人的文件夹访问问题

macos - OSX Touch 命令——坏了?