私は、ユーザーデータセクションでbashを実行することに関連するAWS EC2用のTerraformモジュールを作成しています。開発時に作成したスクリプトで問題が発生しましたが、AWS Supportでこの行が見つかるまで、AWSまたはTerraformはどちらもエラーログを提供しませんでした。法廷:
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
答え1
これをいくつかの部分に分けてみましょう。
exec
リダイレクトはシェル自体に適用されるため、シェルexec > somefile
とその子孫の後続のすべての出力は実際にこのファイルに割り当てられます。
ここでは、単純なファイル名の代わりにプロセス置換を使用します>( command... )
。内部でコマンドを実行し、コマンド入力に関連付けられたファイル名を生成するようにシェルに指示します。プロセス置換をfoo > >(bar)
除いてfoo | bar
、より複雑な場合でも使用でき、パイプなどのサブシェルを呼び出すことはありません。 (<(command...)
代わりにこれを行うと出力コマンドがファイルから出たように見えます。 )
内部コマンドは、tee filename | logger ...
入力tee
をstdoutおよび指定されたファイルにコピーし、logger
入力をsyslogに送信します。 (2>/dev/console
のエラー出力にはリダイレクトが適用されますlogger
。syslogが機能しないと、一部のエラーが印刷されることがあります。)
もしそうなら、そうです2>&1
。エラーメッセージ(stderr)も同じプロセス置換にリダイレクトするようにシェルに指示します。
したがって、リダイレクト後、シェルのすべての出力(通常の出力とエラー出力)は(経由tee
で)ファイルに転送され(経由でlogger
)syslogに送信されます。
(AWSで使用することに特別なことがなければ、これらのいずれもAWSまたはLinuxに限定されないと思いますlogger
。)