다른 명령을 래핑하고 stdout/stderr 순서에 문제가있는 Groovy 스크립트를 작성하려고합니다. 내 스크립트는 다음과 같습니다 :출력이 잘못된 순서로 나타나는 이유는 무엇입니까?
#!/usr/bin/env groovy
synchronized def output = ""
def process = "qrsh ${args.join(' ')}".execute()
def outTh = Thread.start {
process.in.eachLine {
output += it
System.out.println "out: $it"
}
}
def errTh = Thread.start {
process.err.eachLine {
output += it
System.err.println "err: $it"
}
}
outTh.join()
errTh.join()
process.waitFor()
System.exit(process.exitValue())
내 문제는 출력이 올바른 순서로 단말기에 표시되지 않는다는 것입니다. 래퍼의 출력은 다음과 같습니다.
[<cwd>] wrap.groovy -cwd -V -now n -b y -verbose ant target
waiting for interactive job to be scheduled ...
Your interactive job 2831303 has been successfully scheduled.
Establishing builtin session to host <host> ...
Buildfile: build.xml
BUILD FAILED
Target "target" does not exist in the project "null".
Total time: 0 seconds
Your job 2831303 ("wrap.groovy") has been submitted
다음은 언 래핑 된 명령 출력입니다. 왜 메시지 "당신의 작업이 제출되었습니다"않습니다
[<cwd>] qrsh -cwd -V -now n -b y -verbose ant target
Your job 2831304 ("ant") has been submitted
waiting for interactive job to be scheduled ...
Your interactive job 2831303 has been successfully scheduled.
Establishing builtin session to host host ...
Buildfile: build.xml
BUILD FAILED
Target "target" does not exist in the project "null".
Total time: 0 seconds
한 캐스트의 첫 번째 행과 다른의 마지막 줄에 표시? Groovy가 아니라 Java 라이브러리와 관련이 있다고 생각합니다.
스트림 간의 상대적인 순서 문제는 이해하지만 각 스트림 내에서 순서가 맞아야합니까? 나는 소스에 의해 주석이 달린 선을 보여주지 않았지만 stdout 순서가 잘못되었습니다. 필자는 Perl 래퍼 (wrapper)도 썼고, 똑같은 문제가있다. 이동하는 회선이 터미널에 직접 쓰여질 수 있습니까? 그것도 여전히 표준 출력으로 만드는 것 같습니다. – dromodel
쉘을 사용하여 리다이렉션을 시도했지만 그 자체의 문제가 있습니다. 첫째, 인수를 올바르게 벗어나기가 어렵습니다. 둘째,이 프로그램은 단순한 래퍼 (wrapper)이기 때문에 stderr를 유지하고 싶습니다. 마지막으로, Solaris에서 쉘에서 리디렉션 할 때 "잘못된 파일 번호"오류가 발생합니다. – dromodel
스트림 내의 상대적인 순서는 변경할 수 없습니다. 출력의 다른 위치에 나타나는 행을 보면 다른 사람이 그 행을 터미널에 씁니다. 내 생각 엔 감싸 진 스크립트는 다른 프로세스를 시작한다. 당신이 래퍼의 stdio를 리디렉션 할 때 어떻게 콘솔에 쓸 수 있는지 잘 모르겠습니다. –