簡體   English   中英

遠程服務器中的processbuilder監視器日志文件

[英]processbuilder monitor log file in remote server

我在嘗試着:

  1. 執行Bash腳本
  2. 讀取日志文件

我有以下使用processBuilder的代碼,該程序具有readLog函數(可讀取日志文件)和executeBash(可執行命令,然后銷毀processbuilder的readlog進程)。 但是由於readLog文件正在讀取實時日志文件,所以executeBash永遠不會被調用。

如何實時讀取日志文件並與executeBash同時顯示?


public void performAction(OssSystem system) {
        readLog(system);
        executeBash(system);
    }

public void executeBash(OssSystem system) {
    try {
        Process process = new ProcessBuilder().command("/bin/sh", system.getCommand_path(), system.getParam()).start();

        BufferedReader reader
                = new BufferedReader(new InputStreamReader(process.getInputStream()));
        StringBuilder builder = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            builder.append(line);
            builder.append(System.getProperty("line.separator"));
        }
        int status = process.waitFor();
        cmdResult = builder.toString() + " command status " + status;
        int exitValue = process.exitValue();            
        readProcess.destroy();
    } catch (IOException ex) {
        LOG.log(Level.SEVERE, null, ex);
    } catch (InterruptedException ex) {
        LOG.log(Level.SEVERE, null, ex);
    }

}

String logOutput;

Process readProcess;

public void readLog(OssSystem system) {

    String user = system.getUsername() + "@" + system.getIp();
    String cmd = "tail -f " + system.getLog_dir() + " | less";      
    try {
        readProcess = new ProcessBuilder().command("/usr/bin/ssh", user, cmd).start();
        int status = readProcess.waitFor();
        BufferedReader reader
                = new BufferedReader(new InputStreamReader(readProcess.getInputStream()));
        StringBuilder builder = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            builder.append(line);
            builder.append(System.getProperty("line.separator"));
        }
        logOutput = builder.toString() + " command status " + status;
    } catch (IOException ex) {
        Logger.getLogger(Shell.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InterruptedException ex) {
        Logger.getLogger(Shell.class.getName()).log(Level.SEVERE, null, ex);
    }
}

根據javadoc,

如有必要,使當前線程等待,直到此Process對象表示的進程終止。 如果子進程已經終止,則此方法立即返回。 如果子進程尚未終止,則調用線程將被阻塞,直到子進程退出。

因此, readProcess.waitFor(); 將阻塞主線程,您將永遠無法期待executeBash(system); 在readProcess終止之前被調用。

您可以啟動線程來啟動readProcess

public void performAction(OssSystem system) {
    readLog(system);
    ExecuteBashThread thread = new ExecuteBashThread(system);
    thread.start();
}

class ExecuteBashThread extends Thread{
    private OssSystem system;
    public ExecuteBashThread(OssSystem system){
        this.system = system;
    }
    @Override
    public void run(){
        executeBash(system);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM