exec > AWS EC2 사용자 데이터를 어떻게 처리합니까?

exec > AWS EC2 사용자 데이터를 어떻게 처리합니까?

저는 사용자 데이터 섹션에서 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.)

관련 정보