Bash

exec > 如何在 AWS EC2 使用者數據中工作?

  • September 28, 2021

我正在為 AWS EC2 編寫一個 Terraform 模組,該模組涉及在使用者數據部分執行 bash。在我開發時,我編寫的腳本中存在問題,但 AWS 和 Terraform 都沒有提供任何日誌來記錄我遇到的錯誤,直到我在 AWS 支持論壇中找到這一行:

exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1

這一行將腳本的所有輸出寫入user_data成功/var/log/user-data.log,但我不明白整行。我知道exec >將所有輸出寫入一個文件,在這種情況下>(..),但我不明白為什麼要使用它tee或那裡需要管道。

讓我們把它分成幾部分:

exec對外殼本身應用重定向,因此確實exec > somefile會將外殼及其子級的所有後續輸出定向到該文件。

在這裡,我們有程序替換,而不是簡單的文件名>( command... )。它告訴外殼程序在裡面執行命令,並創建一個連接到該命令輸入的文件名。foo > >(bar)有點像foo | bar,除了程序替換也可以用於更複雜的情況,並且不要像管道那樣呼叫子shell。(<(command...)相反,它會使命令的輸出看起來好像來自文件。)

裡面的命令是tee filename | logger .... tee將其輸入複製到標準輸出和給定文件,logger並將其輸入發送到系統日誌。(重定向2>/dev/console將應用於來自 的錯誤輸出logger,如果系統日誌不起作用,它可能會列印一些錯誤。)

然後是2>&1,它告訴 shell 將錯誤消息(stderr)也重定向到相同的程序替換。

因此,在重定向之後,shell 輸出的所有內容(正常輸出和錯誤輸出)都會(通過tee)到文件和(通過logger)到 syslog。

(我認為這些都不是特定於 AWS 或 Linux 的,當然,除非logger在 AWS 上使用有一些特殊性。)

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