前の出力に特定の文字列が含まれている場合は、自動的にコマンドを再実行する必要があります。

前の出力に特定の文字列が含まれている場合は、自動的にコマンドを再実行する必要があります。

Adobe 端末コマンド「aerender」を使用して After Effects レンダーファームを構築しました。 2台の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の標準エラーが印刷され、次にすべての標準出力が印刷されることです。

試してみる正しいシステムがないため、これらすべてはテストされていません。

おすすめ記事