java - 从 Java 运行 apachetop

标签 java unix

由于我有太多的 apache 日志文件,我决定创建一个 java 程序来构建命令来运行 apachetop。所以我决定创建一个索引文件,所有的 apache_log 文件都将放置在其中。

apache_logs_index

/opt/lampp/logs/access_log
/opt/lampp/logs/error_log
/opt/lampp/logs/php_error_log
/opt/lampp/logs/ssl_request_log
/opt/lampp/logs/mb.domain.com-access_log
/opt/lampp/logs/mb.domain.com-error_log
/opt/lampp/logs/my.domain.com-access_log
/opt/lampp/logs/my.domain.com-error_log
/opt/lampp/logs/op.domain.com-access_log
/opt/lampp/logs/op.domain.com-error_log

我创建了一个 java 程序来为我构建命令。

ApacheTopCall.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ApacheTopCall{

        public static void main(String args[]) {

                String fileName = "apache_logs_index";
                String command = "apachetop";
                command = command + " -d 1";
                try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {

                        String line;
                        while ((line = br.readLine()) != null) {
                                command = command + " -f " + line.trim();
                        }
                        //System.out.println(command);
                        ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", command);
                        Process p = pb.start();
                        p.waitFor();
                } catch (IOException|InterruptedException e) {
                        e.printStackTrace();
                }

        }

}

现在我想要的就是自行运行 apachetop 。我尝试使用 ProcessBuilder 调用它,但 apachetop 没有显示,而是只是等待进程退出。当我运行 java 代码时,我希望执行该命令并且应该运行 apachetop

当我执行由java代码构建的命令时,它运行良好。但不适用于 ProcessBuilder

最佳答案

如果您想要实现的只是这个,那么这里是简单而有效的解决方案:

您还需要对 Java 代码进行一些小的更改,如下所示:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ApacheTopCall{

        public static void main(String args[]) {

                String fileName = "apache_logs_index";
                String command = "apachetop";
                command = command + " -d 1 -q -l -r -p"; //extra params
                try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {

                        String line;
                        while ((line = br.readLine()) != null) {
                                command = command + " -f " + line.trim();
                        }
                        System.out.println(command); //we are just creating the command for run. The C program actually run the generated command.
                        //ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", command);
                        //Process p = pb.start();
                        //p.waitFor();
                } catch (IOException e) {
                        e.printStackTrace();
                }

        }

}

我创建了一个简单的 C 程序apachetopall.c

#include <stdio.h>

int main(){
        FILE *fp = popen("cd /root/scripts/; java ApacheTopCall", "r"); //make sure you cd to the location of your java class.
        char cmd[32768];
        fgets(cmd, 32768, fp);
        system(cmd);
        return 0;
}

使用以下命令编译它并将其保存为 apachetopall

gcc -o apachetopall apachetopall.c

现在您需要做的就是执行二进制文件apachetopall。你的目标就达到了。

工作原理

我们不是要求 java 运行命令,而是要求 java 创建需要触发的命令。现在,C 程序运行 java 代码并获取命令作为输出,并触发相同的命令,该命令显示在屏幕的前面。

关于java - 从 Java 运行 apachetop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38719447/

相关文章:

Java printf 给出 "change type to Object"错误

java - 将byte []数组的元素组合成16位数字

linux - 在大文本文件中快速查找模式?

java - 接口(interface)覆盖另一个接口(interface)的方法

java - 如何将 spring mvc 连接到动态数据列表

java - Hibernate 无法创建具有 @ManyToOne 关系的表

linux - 在 Linux 上删除当前目录

linux - Bash 脚本如果已经运行则等待,然后继续

java - 区别 - 通过 java 和通过提示执行 unix 命令,即正常执行

javascript - 如何存储标准输出的结果?