読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

シェル実行監視プログラムをさくっと書いてみた。

Java Tips

まずは結果を受け取る構造体。(bean にしたきゃすればいい)

public class ExecutionResult {
    public String execDir;
    public String execTarget;
    public int resultCode;
    public ArrayList<String> stdResult;
    public ArrayList<String> errResult;
}

シェルの仕様上、戻り値は0-255だから、別にIntでなくていいのかも知れない。まぁいいや。
で、プロセス実行用クラス。

public class ProcessRunner {
    ProcessBuilder builder;
    
    public ProcessRunner(String executionPath, String... commands) {
        this.builder = new ProcessBuilder(commands);
        this.builder.directory(new File(executionPath));
    }

    public void addEnvironmentArgument(String name, String value) {
        this.builder.environment().put(name,value);
    }

    public synchronized ExecutionResult exec() throws Exception {
        Process process = this.builder.start();
        StreamReadThread stdReader = new StreamReadThread(process.getInputStream());
        StreamReadThread errReader = new StreamReadThread(process.getErrorStream());

        stdReader.start();
        errReader.start();

        process.waitFor();

        stdReader.join();
        errReader.join();

        ExecutionResult result = new ExecutionResult();
        result.execDir    = this.builder.directory().getAbsolutePath();
        result.execTarget = this.builder.command().get(0);
        result.resultCode = process.exitValue();
        result.stdResult  = stdReader.getResult();
        result.errResult  = errReader.getResult();

        return result;
    }
}

class StreamReadThread extends Thread {
    private BufferedReader reader;
    private ArrayList<String> result = new ArrayList<String>();

    public StreamReadThread(InputStream io) {
        reader = new BufferedReader(new InputStreamReader(io));
    }

    @Override
    public void run() {
        try {
            while (true) {
                String line = reader.readLine();
                if (line == null) break;
                result.add(line);
            }
        } catch (Exception e) {

        } finally {
            try {
                reader.close();
            } catch (Exception e) {}
        }
    }

    public ArrayList<String> getResult() {
        return result;
    }
}

Java のお行儀なんぞ知るかと言わんばかりのパワーコード。お行儀より読みやすさ優先じゃい。