성공할 때까지 명령 실행

최근에 유용한 간단한 BASH 패턴:

Run command every time it fails until it doesn't fail.



command  
while [ $? -ne 0 ]; do  
    command  
done


예시

작은 배치로 수십만 개의 레코드를 내보내야 하는 장기 실행 작업이 있었습니다.

처음 작성했을 때 실패 시 다시 시작할 수 있도록 페이지offset를 설정할 수 있었습니다.

vendor-export --batch-size=250 --offset=20


일주일 동안 production 데이터로 드라런을 수행했습니다. 이를 통해 발생할 수 있는 모든 가능한 데이터 오류에 대한 오류 처리를 구현할 수 있었습니다. 그리고 우리가 통제할 수 있는 어떤 상황으로 인해 실패하지 않고 작업이 완전히 실행될 것이라고 확신했습니다.

그러나 네트워크 오류를 완화하기 위해 우리가 할 수 있는 실질적인 방법은 없었습니다. 이러한 경우에 재시도 루프를 구현하는 것은 확실히 가능하지만 다른 중요한 시스템에 영향을 미치므로 이 시스템 내에서는 실용적이지 않습니다. 프로세스가 일회용이라는 점을 감안할 때 작업에 제시된 위험은 정당화될 수 없습니다.

그리고 여기서 패턴이 나오는데...

장기 실행 명령에 resume 옵션을 추가하여 작업이 실패한 위치를 정확히 선택할 수 있었습니다.

vendor-export --batch-size=250 --resume


이제 실제로 작업을 실행할 시간이 되면 다음을 호출하십시오.

vendor-export --batch-size=250 --resume

while [ $? -ne 0 ]; do  
    vendor-export --batch-size=250 --resume
done


그럼 밖에 나가서 하루를 즐기세요...

죄송합니다. 여기에 약간의 문제가 있을 수 있습니다...



이 패턴을 이미 사용해 본 적이 있다면 이미 찾았을 것입니다.

In some terminals, ctrl-c won't interrupt the process.



항상 그런 것은 아닙니다. 그러나 때때로 이런 일이 발생할 수 있습니다.

문제가 발생하면 트랩ctrl-c하고 종료하면 됩니다.

function quit-it() {
    exit 0  
}  

vendor-export --batch-size=250 --resume

while [ $? -ne 0 ]; do  
    trap quit-it INT  
    vendor-export --batch-size=250 --resume
done

좋은 웹페이지 즐겨찾기