- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于我有太多的 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/
我们经常会需要知道服务器的实时监测服务器的运行状况,比如哪些 URL 的访问量最大,服务器每秒的请求数,哪个搜索引擎正在抓取我们网站?面对这些问题,我们虽然可以去分析查看统计访问日志文件,但是却不能
是否可以将输出从 apachetop 导出到文件?像这样:“apachetop > file”,但是因为 apachetop 正在“永远”运行,所以这个命令也会永远运行。我只需要从该程序获取实际输出并
由于我有太多的 apache 日志文件,我决定创建一个 java 程序来构建命令来运行 apachetop。所以我决定创建一个索引文件,所有的 apache_log 文件都将放置在其中。 apache
我是一名优秀的程序员,十分优秀!