스크립트 출력을 구문 분석하여 실행 중이거나 대기 중인 PBS 작업 qstat -tn1
수를 확인하려고 합니다 bash
. 이것은 지금까지 작동했습니다.
count ()
{
qstat -tn1 | awk '
BEGIN { R = 0; Q = 0; }
$10 == "R" { R++ }
$10 == "Q" { Q++ }
END { print R, Q }'
}
if read -r R Q < <(count)
...
qstat
그러나 때로는 알 수 없는 이유로 실패하는 경우도 있습니다 . 이 경우 아무것도 인쇄하지 않고 stdout
일부 오류 메시지를 인쇄하며 stderr
0이 아닌 상태(보통 표준)로 종료됩니다. 그러나 awk
실패 하고 수신된 빈 입력을 qstat
행복하게 인쇄합니다 . 0 0
그런 다음 read
둘 다에 0을 할당 R
하고 실제로 실패했는지 Q
알 수 없습니다 .qstat
R
실행 중인 프로세스나 대기 중인 프로세스가 없을 수 있으므로 스크립트 블록에서 0으로 초기화해야 하며 , 이러한 프로세스의 수를 가져오려면 빈 문자열만 인쇄하는 것이 아니라 인쇄해야 합니다.Q
BEGIN
awk
0
- 이렇게 하면 0이 아닌 상태로 종료할
set -o pipefail
수 있지만 종료 상태는 표시되지 않고 어쨌든 빈 입력을 실행하고 인쇄합니다 .count
read
awk
0 0
- 명명된 파이프와 하위 프로세스를 시도해 볼 수도 있지만 관리가 너무 복잡하다고 느껴집니다.
count
호출자가 실패를 감지할 수 있는 좋은 방법이 있습니까 ?
답변1
count
프로세스 대체를 읽으면 반환 상태를 얻을 수 없다고 생각합니다 . 그러니 하지 마세요. 대신 결과를 변수에 저장하거나 파이프를 사용하십시오.
count=$(count)
if [ $? -eq 0 ]; then
read -r R Q <<<"$count"
…
또는
set -o pipefail
if count | { read -r R Q; … }
PIPESTATUS
또 다른 가능성은 변수를 사용하여 첫 번째 명령의 반환 상태를 확인하는 것입니다.
count=$(qstat -tn1 | awk …)
if ((${PIPESTATUS[0]} == 0)); then
read P Q
…
또는 입력이 비어 있을 때 awk가 고유한 항목(예: 아무것도 없음)을 인쇄하도록 준비합니다.
awk '
BEGIN { R = 0; Q = 0; }
$10 == "R" { R++ }
$10 == "Q" { Q++ }
END { if (NR) print R, Q }'
ifne
from을 사용하여 명령에 대한 입력이 비어 있는지 테스트할 수 있습니다.더 많은 유틸리티또는다른 방법. 그러나 awk로 파이프를 연결하고 있으므로 기존 awk 스크립트에서 수행하는 것이 좋습니다.
명령에서 반환 상태를 가져와야 하는 경우 qstat
추가 입력 줄로 awk에 제공할 수 있습니다. 더 쉽게 구문 분석하려면 마지막 줄을 고유한 형식으로 정렬하세요.
{
qstat -tn1
echo exit_code = $?
} | awk '
…
/^exit_code = / { status = $3 }
END { if (status == 0) print Q, R }
'
답변2
이것:
count ()
{
{ qstat -tn1 || echo "EPIC FAIL" } | awk '
BEGIN { R = 0; Q = 0; }
$10 == "R" { R++ }
$10 == "Q" { Q++ }
END { print R, Q }'
}
if read -r R Q < <(count)
...
성공 하면 qstat
출력이 로 전송됩니다 awk
. qstat
0이 아닌 상태가 반환되면 "EPIC FAIL"이라는 텍스트가 로 전송 됩니다 awk
.
이것은 단지 예일 뿐입니다. echo awk
내부적으로 처리하거나 if read
.