Bash

如果先前的輸出包含特定字元串,我需要自動重新執行命令

  • February 9, 2020

我已經建立了一個使用 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"

我還假設我需要將我的初始命令包裝在另一個命令中以監視此字元串。

我有點迷路了。任何幫助,將不勝感激。

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 支持什麼。這exec使得 fd 3 與腳本的標準輸出相同。我希望 macos 將其作為 /dev/fd/3 提供。tee用於將 aerender 輸出的副本發送到 this,因此腳本輸出與原始程式碼相同的內容。

然後將 tee 的輸出提供給 grep。我故意不使用grep -q,因為它會在看到第一個匹配模式時立即停止處理,這可能導致tee獲得 SIGPIPE,這可能導致 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 的所有 stderr 都會被輸出,然後所有的 stdout 都會被輸出,而不是以預期的交錯方式輸出。

所有這些都未經測試,因為我沒有合適的系統來試用它。

引用自:https://unix.stackexchange.com/questions/566496