首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java运行apachetop

从Java运行apachetop
EN

Stack Overflow用户
提问于 2016-08-02 11:40:20
回答 1查看 35关注 0票数 0

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

apache_logs_index

代码语言:javascript
复制
/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

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-24 12:24:35

如果您只想做到这一点,那么下面是简单而有效的解决方案:

您还需要对java代码做一些小的更改,如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
#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

代码语言:javascript
复制
gcc -o apachetopall apachetopall.c

现在,您需要做的就是执行二进制apachetopall。你的目标就实现了。

是如何工作的

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38719447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档