이전 출력에 특정 문자열이 포함된 경우 자동으로 명령을 다시 실행해야 합니다.

이전 출력에 특정 문자열이 포함된 경우 자동으로 명령을 다시 실행해야 합니다.

Adobe 터미널 명령 "aerender"를 사용하여 After Effects 렌더 팜을 구축했습니다. 두 대의 Mac Pro에서 총 24개의 aerender 인스턴스를 실행하고 있습니다.

잘 작동하지만 때때로 (이유로 인해) 렌더 인스턴스가 실패하고 명령을 다시 실행하려면 키보드를 눌러야 합니다. 나는 기본적으로 모든 렌더링을 처리해야 하는데 이는 분명히 이상적이지 않습니다. 하루 중에 오류가 감지되면 자동으로 다시 시작하고 싶습니다.

현재 렌더링이 실패할 경우 이중 파이프 ||를 사용하여 다른 렌더링을 시작하려고 시도했지만 aerender가 실패하면 여전히 터미널로 깔끔하게 종료되기 때문에 작동하지 않습니다. 이중 파이프는 현재 렌더링을 Control-C하는 경우에만 작동합니다.

내 렌더링 명령은 ...

/Applications/Adobe\ After\ Effects\ 2020/aerender -project "/Volumes/Videos/Test.aep" -sound ON

렌더링이 실패하면 다음과 같이 표시됩니다...

WARNING:After Effects warning: logged 2 errors, please check log.

출력을 검색하려면 grep을 사용해야 한다고 가정합니다."WARNING:After Effects warning"

또한 이 문자열을 모니터링하려면 초기 명령을 다른 명령으로 래핑해야 한다고 가정합니다.

나는 조금 길을 잃었다. 어떤 도움이라도 대단히 감사하겠습니다.

답변1

OP도 출력을 보고 싶어하므로 약간의 스크립트가 필요합니다.

#!/bin/bash
exec 3>&1   # Make a copy of the stdout fd on fd 3
while "/Applications/Adobe After Effects 2020/aerender" -project "/Volumes/Videos/Test.aep" -sound ON |
     tee /dev/fd/3 | 
     grep 'WARNING:After Effects warning' >/dev/null
do
    echo "Repeating the command"
done

여기에 무슨 일이 일어나고 있는데 macOS에서 지원되는 것이 무엇인지 추측하고 있습니다. 이는 execfd 3을 스크립트의 표준 출력과 동일하게 만듭니다. Macos에서 /dev/fd/3으로 사용할 수 있게 해줬으면 좋겠습니다. tee여기에 aerender 출력의 복사본을 보내는 데 사용되므로 스크립트는 원본 코드와 동일한 콘텐츠를 출력합니다.

그런 다음 tee의 출력을 grep에 공급합니다. grep -q첫 번째 일치 패턴이 확인되면 처리가 중지되어 aerender가 teeSIGPIPE를 얻을 수 있고 이로 인해 aerender가 SIGPIPE를 얻을 수 있기 때문에 의도적으로 이것을 사용하지 않습니다 . aerender가 많은 출력을 생성하지 않고 메시지를 한 번만 출력하는 경우 지나치게 조심하게 될 수 있지만 그렇게 해도 해가 되지는 않습니다.

macos가 /dev/fd/3을 지원하지 않으면 시도해 볼 수 있습니다.

#!/bin/bash
while O="$("/Applications/Adobe After Effects 2020/aerender" -project "/Volumes/Videos/Test.aep" -sound ON)"
    echo "$O"
    echo "$O" | grep 'WARNING:After Effects warning' >/dev/null
do
    echo "Repeating the command"
done

이것의 단점은 예상되는 인터리브 방식이 아닌 모든 aerender의 표준 오류가 인쇄된 다음 모든 표준 출력이 인쇄된다는 것입니다.

시도해 볼 수 있는 올바른 시스템이 없기 때문에 이 모든 것은 테스트되지 않았습니다.

관련 정보