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