특정 오류 메시지가 발생하면 명령을 다시 실행하십시오.

특정 오류 메시지가 발생하면 명령을 다시 실행하십시오.

오류가 발생할 수 있는 명령을 실행하고 있습니다.

cmd sub-cmd --param1 value1 --param2 value2

이 명령은 오류를 반환할 수 있습니다. 오류 메시지는 특정 문자열로 끝나는 특정 오류 메시지입니다(시작은 다르지만 끝은 항상 동일함). cmd특정 문자열로 끝나는 오류 메시지가 특정 횟수(예: 5회) 반환되는 경우 동일한 명령을 다시 시도하기 위한 작은 쉘 스크립트 코드를 찾고 있습니다 . 또한, 매개변수가 허용된다는 점에 유의하십시오 cmd. 나는 쉘 스크립트가 내 것이 무엇이든 전달할 수 있기를 원합니다 cmd. 오류 메시지가 내가 찾고 있는 메시지가 아닌 경우, 쉘 스크립트는 오류를 반환하고 중지( exit(1)). 감사해요.

답변1

그런 다음 명령의 출력을 캡처해야 합니다. 모든 것을 캡처할 수 있다면(또는 표준 출력을 무시할 수 있다면) 가장 간단합니다.

#!/bin/bash
errormsg=$( cmd "$@" 2>&1 >/dev/null )
re="known error message$"
if [[ $errormsg =~ $re ]]; then
    echo "cmd failed with known message
fi

그 안의 명령 대체 $(..)및 리디렉션은 명령의 표준 오류 출력을 캡처하고 오류가 아닌 출력을 로 리디렉션합니다 . 그런 다음 이를 문자열의 끝이 문자열의 끝을 나타내는 /dev/null정규식과 비교합니다 . $(명령 대체는 후행 줄 바꿈을 제거하므로 정규 표현식이 이러한 줄 바꿈과 일치할 필요가 없습니다.) "$@"스크립트의 인수로 확장하여 에 인수로 전달합니다 cmd.

물론 프로그램을 반복적으로 실행하려면 루프가 필요합니다. 명령 대체의 대안은 임시 파일을 사용하여 오류 출력을 저장하고 나중에 보는 것입니다. 또한 명령의 표준 출력을 표시하는 것이 더 쉬워지므로 다음과 같이 합시다.

#!/bin/bash
re="known error message$"

retries=0
max_retries=5
errorfile=$(mktemp)                       # temp file for the errors
trap 'rm "$errorfile"' EXIT               # remove the temp file on exit

while cmd "$@" 2> "$errorfile";           # run the command
      ret=$?;                             # save the exit code
      [[ $( < $errorfile ) =~ $re ]]; do  # check the output
    cat "$errorfile" >&2                  # print the errors to
                                          # the script's stderr, too

    retries=$((retries+1))                # retry a couple of times
    echo -n "cmd failed with known message"
    if [[ $retries -lt $max_retries ]]; then
        echo ", retrying."
    else
        echo ", exit."
        exit 1
    fi
done
cat "$errorfile" >&2
echo "cmd completed with status $ret";    # use saved exit code, since it might
exit "$ret"                               # have failed for other reasons

( while cmd1; cmd2; do ...달리다지침 1먼저 실행한 다음지침 2루프 조건으로. )

위에서는 명령의 실제 종료 상태를 무시하고 출력만 살펴보았습니다. 종료 상태를 고려하려면 스크립트를 변경해야 합니다.

관련 정보