exec > 如何在 AWS EC2 使用者數據中工作?
我正在為 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 上使用有一些特殊性。)