我正在通過 bash 腳本將我的應用程式部署到 GCP。我想捕獲變數中的任何部署錯誤,并在發生部署錯誤時執行一些操作。
我的部署命令如下所示:
gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote &
您可以假設此命令正在使用我傳遞的變數。我嘗試了以下變體:
變數=$(...)
var=$(gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote &)
echo ******************************
echo "${var}"
echo *********** *******************變數=`...`
var=`gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote &`
回聲 ******************************
回聲 $var
回聲 *************** ***************
我嘗試過的 GCP 方面的其他變體:
--verbosity="警告"
var=$(gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote --verbosity="warning" &)
--verbosity="錯誤"
var=$(gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote --verbosity="error" &)
--log-http
var=$(gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote --log-http &)
--user-output-enabled
var=$(gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote --user-output-enabled &)
到目前為止我嘗試過的所有東西, $var 總是回傳空。即使在部署程序中出現錯誤。
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 0 files to Google Cloud Storage ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
ERROR: (gcloud.app.deploy) ABORTED: Cannot operate on apps/my-app-qa/services/search/versions/1 because an operation is already in progress for apps/my-app-qa/services/search/versions/1 by 3458c670-76bd-42ec-a971-c0ceda7ef34f.
******************************
******************************
當通過 bash 腳本進行部署時,有沒有辦法檢測 GCP 部署錯誤?好像我錯過了一些非常基本的東西,但不能指望它。
uj5u.com熱心網友回復:
更新:我在下面寫的內容仍然有效,但我錯過了主要問題:您嘗試gcloud在后臺運行該工具(通過&其命令列末尾的 ),這意味著呼叫在$()構造之前立即回傳捕捉任何東西的機會。
您實際上所做的是在命令實際上有機會輸出任何內容之前將命令的輸出分配給您的變數。所以你基本上有兩種選擇:
選項 1:在前臺運行命令并在腳本完成后繼續執行。如果命令運行了很長時間并且“背景”是故意的,這顯然是行不通的。
選項 2:在后臺運行命令,將其 stderr 重定向到一個檔案(見下文),然后主動監視該檔案的更改(即錯誤)。這當然是泥潭,具體的方法很大程度上取決于您希望腳本做什么。
原始答案:
我特別不熟悉 gcloud 工具,但我認為它會將錯誤訊息列印到 stderr(命令列工具的約定也是如此)。該$(command)構造捕獲標準輸出,因此您可以獲得除錯誤之外的所有內容。
要解決這個問題,您必須在 gcloud 呼叫中重定向 stderr:
var=$(gcloud --options 2>&1)
告訴構造生成的2>&1嵌套 shell將輸出流 #2 (= stderr)$()重定向 ( >) 到與&流 #1 (= stdout) 相同的位置 (),從而將其捕獲到您的變數中。
由于您可能只想捕獲stderr,因此您還需要擺脫 stdout:
var=$(gcloud --options 2>&1 >/dev/null)
將>/dev/null默認流 (= stderr) 重定向到 void。
如果您想同時顯示命令輸出并捕獲其錯誤,另一種方法是將 stderr 輸入tee(列印輸入并將副本保存到檔案的工具),然后將捕獲的錯誤檔案讀入您??的變數:
gcloud --options 2| tee /tmp/my-gcloud-errors
var=$(cat /tmp/my-gcloud-errors)
(答案可能包含錯誤,因為我是在我的手機上打字,腿上有一只貓。稍后會修復)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/463660.html
上一篇:printf將逗號列印到檔案
