Đầu ra không đầy đủ về Java Runtime.getRuntime (). Execute (lệnh)

Oct 28 2020

Tôi muốn xây dựng một ứng dụng giống như Jenkins terminal:

Và tôi sử dụng Java Runtime.getRuntime().exec(command)để thực hiện lệnh, phát hiện ra rằng đầu ra chưa hoàn chỉnh.

texthell.sh:

# textshell.sh
echo "wwwwwww";
sleep 2
ls

Ví dụ: Khi tôi thực thi texthell.sh trong thiết bị đầu cuối mac của mình sh -x testshell.sh , hãy xuất:

+ echo wwwwwww
wwwwwww
+ sleep 2
+ ls
testshell.sh

nhưng khi tôi thực thi bằng java Java Runtime.getRuntime().exec("sh -x testshell.sh") , đầu ra:

wwwwwww
testshell.sh

vỏ đạn -xcó vẻ vô dụng

Làm thế nào tôi có thể sửa chữa nó?

Trả lời

1 DuncG Oct 28 2020 at 13:35

Như @Joachim Sauer đã chỉ ra rằng bạn không đọc STDERR, vì vậy hãy bỏ lỡ các dòng phát ra tiếng vọng từ set -xđầu ra. Điều chỉnh mã của bạn để truy cập process.getErrorStream().

Ngoài ra, bạn có thể chuyển sang ProcessBuildernếu muốn đọc luồng lỗi được hợp nhất với đầu ra:

String[]cmd = new String[]{"sh", "-x", "testshell.sh"}
ProcessBuilder pb = new ProcessBuilder(cmd);

// THIS MERGES STDERR>STDOUT:
pb.redirectErrorStream(true);

// EITHER send all output to a file here:
Path stdout = Path.of("mergedio.txt");
pb.redirectOutput(stdout.toFile());

Process p = pb.start();

// OR consume your STDOUT p.getInputStream() here as before:

int rc = p.waitFor();

System.out.println("STDOUT: \""+Files.readString(stdout)+'"');