exec > 如何处理 AWS EC2 用户数据?

Ahm*_*led 2 bash io-redirection process-substitution exec

我正在为 AWS EC2 编写一个 Terraform 模块,其中涉及在用户数据部分执行 bash。当我开发时,我编写的脚本中遇到了问题,但 AWS 和 Terraform 都没有提供任何错误日志,直到我在 AWS 支持论坛中找到这一行:

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

user_data这一行成功写入了脚本执行的所有输出/var/log/user-data.log,但我不理解整行。我知道exec >将所有输出写入一个文件,在这种情况下>(..),但我不明白为什么使用它tee或需要那里的管道。

ilk*_*chu 7

让我们把它分成几部分:

\n

exec在 shell 本身上应用重定向,所以确实exec > somefile会将 shell 及其子级的所有后续输出定向到该文件。

\n

在这里,我们使用进程替换代替简单的文件名>( command... )。它告诉 shell 在内部运行命令,并创建一个连接到该命令输入的文件名。foo > >(bar)有点像foo | bar,除了进程替换也可以用于更复杂的情况,并且不像管道那样调用子shell。(<(command...)则相反,它会使输出看起来像是来自文件。)

\n

里面的命令是tee filename |\xc2\xa0logger .... tee将其输入复制到 stdout 和给定文件,并将logger其输入发送到系统日志。(重定向2>/dev/console将应用于错误输出logger,如果系统日志不起作用,它可能会打印一些错误。)

\n

然后就是2>&1,它告诉 shell 将错误消息(stderr)也重定向到相同的进程替换。

\n

因此,在重定向之后,shell 输出的所有内容(正常输出和错误输出)都会(通过tee)到达文件并(通过logger)发送到系统日志。

\n

(我认为这些都不是 AWS 或 Linux 特有的,除非使用时有一些特殊性logger在 AWS 上的使用有一些特殊性。)

\n