소개
이 튜토리얼은 표준 에러 (stderr) 스트림을 이해하고 관리하는 데 중점을 두고 Linux 표준 스트림 작업을 안내합니다. Linux 시스템에서 오류 처리 및 로깅에 유용한 기술인 tee 명령을 사용하여 stderr 출력을 캡처하고 처리하는 방법을 배우게 됩니다.
Linux 표준 스트림 이해
Linux 는 입력 및 출력 작업을 처리하기 위해 세 가지 기본 스트림을 사용합니다. 이러한 스트림은 Linux 환경에서 프로그램이 통신하는 방식의 기초를 형성합니다.
표준 스트림이란 무엇인가요?
Linux 환경에서 터미널을 엽니다. 실제 예제를 통해 표준 스트림의 개념을 살펴보겠습니다.
표준 스트림은 프로그램과 환경을 연결하는 통신 채널입니다. Linux 에는 세 가지 표준 스트림이 있습니다.
- 표준 입력 (stdin) - 파일 디스크립터 0
- 표준 출력 (stdout) - 파일 디스크립터 1
- 표준 에러 (stderr) - 파일 디스크립터 2
몇 가지 간단한 명령을 사용하여 이러한 스트림을 실제로 살펴보겠습니다.
표준 입력 (stdin) 시연
표준 입력은 프로그램이 데이터를 받는 방법이며, 일반적으로 키보드 입력을 통해 받습니다.
터미널에 다음 명령을 입력합니다.
cat
이제 텍스트를 입력하고 Enter 키를 누릅니다. cat 명령은 stdin 에서 읽어 stdout 으로 출력합니다. 몇 줄의 텍스트를 더 입력합니다.
cat 명령을 종료하려면 Ctrl+D (파일 끝을 나타냄) 를 누릅니다.
표준 출력 (stdout) 시연
표준 출력은 프로그램이 일반적인 출력을 보내는 곳입니다.
다음 명령을 실행합니다.
echo "This message goes to standard output"
다음과 같은 출력을 볼 수 있습니다.
This message goes to standard output
echo 명령은 텍스트를 stdout 으로 보내며, 이는 터미널에 표시됩니다.
표준 에러 (stderr) 시연
표준 에러는 프로그램이 오류 메시지 및 경고를 보내는 곳입니다.
오류를 생성하려면 다음 명령을 실행합니다.
ls /nonexistent_directory
다음과 유사한 오류 메시지를 볼 수 있습니다.
ls: cannot access '/nonexistent_directory': No such file or directory
이 오류 메시지는 stderr 으로 전송되지만, stdout 과 마찬가지로 터미널에 표시됩니다.
stdout 과 stderr 구분
stdout 과 stderr 의 차이점을 확인하기 위해 별도로 리디렉션해 보겠습니다.
ls /home /nonexistent_directory > output.txt 2> error.txt
이제 각 파일의 내용을 검사합니다.
cat output.txt
cat error.txt
output.txt에는 /home 디렉토리의 목록이 포함되어 있고, error.txt에는 존재하지 않는 디렉토리에 대한 오류 메시지가 포함되어 있는 것을 볼 수 있습니다.
Linux 에서 프로그램의 입력 및 출력을 제어하려면 이러한 스트림의 작동 방식을 이해하는 것이 중요합니다.
tee 명령 소개
이제 표준 스트림을 이해했으므로, 이러한 스트림을 관리하는 강력한 방법을 제공하는 tee 명령에 대해 알아보겠습니다.
tee 명령이란 무엇인가요?
Linux 의 tee 명령은 입력을 받아 표준 출력과 하나 이상의 파일로 동시에 보냅니다. 이는 배관에서 물을 두 방향으로 보내는 T 자형 분배기에서 이름을 따왔습니다.
기본적인 예제를 통해 tee가 어떻게 작동하는지 살펴보겠습니다.
echo "Hello, tee command" | tee hello.txt
다음과 같은 출력을 볼 수 있습니다.
Hello, tee command
이 텍스트는 터미널에 나타나고 hello.txt에도 저장됩니다. 파일을 확인하여 이를 확인합니다.
cat hello.txt
tee 와 표준 출력 결합
tee를 프로그램 출력과 함께 사용하는 방법을 살펴보겠습니다.
ls -la ~ | tee home_contents.txt
이 명령은 홈 디렉토리의 내용을 나열하고, 화면에 표시하며, home_contents.txt에 저장합니다.
tee 를 사용한 기본 오류 처리
기본적으로 tee는 표준 출력만 캡처합니다. 표준 에러도 캡처하려면 먼저 stderr 을 stdout 으로 리디렉션해야 합니다.
다음 예제를 시도해 보세요.
ls /home /nonexistent_directory 2>&1 | tee mixed_output.txt
2>&1 부분은 stderr (파일 디스크립터 2) 을 stdout (파일 디스크립터 1) 으로 리디렉션하여 두 스트림을 결합합니다. 그런 다음 tee 명령은 이 결합된 출력을 캡처합니다.
파일의 내용을 검사합니다.
cat mixed_output.txt
파일에서 디렉토리 목록과 오류 메시지를 모두 볼 수 있습니다.
덮어쓰기 대신 출력 추가
파일을 덮어쓰는 대신 추가하려면 -a 옵션을 사용합니다.
echo "First line" | tee log.txt
echo "Second line" | tee -a log.txt
내용을 확인합니다.
cat log.txt
두 번째 명령이 파일을 덮어쓰는 대신 추가했으므로 파일에 두 줄이 모두 표시됩니다.
tee 를 사용한 고급 오류 처리
이제 tee의 기본 사항을 이해했으므로, 오류 처리 및 로깅에 대한 보다 고급 사용법을 살펴보겠습니다.
표준 출력과 표준 에러 분리
때로는 stdout 과 stderr 을 별도로 캡처하면서도 둘 다 터미널에 표시하고 싶을 수 있습니다. 두 유형의 출력을 모두 생성하는 스크립트를 만들어 보겠습니다.
nano test_script.sh
스크립트에 다음 내용을 추가합니다.
#!/bin/bash
echo "This is standard output"
echo "This is standard error" >&2
ls /home
ls /nonexistent_directory
파일을 저장하고 (Ctrl+O, Enter) 종료합니다 (Ctrl+X).
스크립트를 실행 가능하게 만듭니다.
chmod +x test_script.sh
이제 stdout 과 stderr 을 모두 별도로 캡처하여 스크립트를 실행합니다.
./test_script.sh > >(tee stdout.log) 2> >(tee stderr.log >&2)
이 복잡한 명령은 다음과 같습니다.
- 스크립트를 실행합니다.
- stdout 을
tee stdout.log로 리디렉션하여 화면에 표시하고 파일에 저장합니다. - stderr 을
tee stderr.log >&2로 리디렉션하여 화면에 표시하고 파일에 저장합니다.
결과를 검사합니다.
cat stdout.log
cat stderr.log
stdout.log에는 일반 출력이 표시되고 stderr.log에는 오류 메시지가 표시됩니다.
완전한 오류 로그 생성
포괄적인 로깅을 위해 다음을 수행할 수 있습니다.
- 일반 출력을 화면으로 보냅니다.
- 오류를 화면과 로그 파일로 모두 보냅니다.
- 추적을 용이하게 하기 위해 오류에 타임스탬프를 추가합니다.
이를 시연하기 위한 스크립트를 만들어 보겠습니다.
nano logging_script.sh
다음 내용을 추가합니다.
#!/bin/bash
## Function to generate a timestamp
timestamp() {
date +"%Y-%m-%d %H:%M:%S"
}
## Echo with timestamp to stderr
echo_error() {
echo "$(timestamp) - ERROR: $1" >&2
}
## Normal output
echo "Starting the script"
## Error output
echo_error "Something went wrong"
## More normal output
echo "Script continuing despite the error"
## Another error
echo_error "Another issue occurred"
## Final output
echo "Script completed"
저장하고 스크립트를 실행 가능하게 만듭니다.
chmod +x logging_script.sh
이제 오류 로깅과 함께 실행합니다.
./logging_script.sh 2> >(tee -a error_log.txt >&2)
이렇게 하면 다음이 수행됩니다.
- 화면에 모든 출력 (stdout 및 stderr) 을 표시합니다.
- 또한
error_log.txt파일에 stderr 을 캡처합니다.
오류 로그를 확인합니다.
cat error_log.txt
추적하기 쉽도록 타임스탬프가 있는 오류 메시지만 표시됩니다.
실제 적용: 진행률 및 오류 처리가 있는 명령
파일을 다운로드하고, 화면에 진행률을 표시하면서 오류를 로깅하는 실용적인 예제를 만들어 보겠습니다.
wget https://example.com/nonexistent_file.txt 2> >(tee -a download_errors.log >&2)
이 명령은 다음을 수행합니다.
- 존재하지 않는 파일을 다운로드하려고 시도합니다.
- 진행률 및 오류를 포함하여 모든 출력을 화면에 표시합니다.
- 또한 모든 오류를
download_errors.log에 로깅합니다.
오류 로그를 확인합니다.
cat download_errors.log
오류 로그에는 다운로드 시도 실패로 인한 오류 메시지만 포함되어 있습니다.
이러한 기술을 사용하면 표준 Linux 명령을 사용하여 정교한 오류 처리 및 로깅 시스템을 구축할 수 있습니다.
요약
이 튜토리얼에서는 tee 명령을 사용하여 오류 처리에 중점을 두고 Linux 에서 표준 스트림을 관리하기 위한 필수 기술을 배웠습니다. 이제 다음을 이해하게 되었습니다.
- Linux 의 세 가지 표준 스트림: stdin, stdout, stderr
tee명령을 사용하여 화면에 표시하면서 출력을 캡처하는 방법- stderr 을 stdout 으로 리디렉션하고
tee로 둘 다 캡처하는 방법 - 서로 다른 출력 스트림을 분리하고 로깅하기 위한 고급 기술
- 실제 시나리오에서 실용적인 오류 로깅을 구현하는 방법
이러한 기술은 강력한 스크립트를 만들고, 애플리케이션 문제를 해결하며, Linux 환경에서 포괄적인 로그를 유지 관리하는 데 유용합니다. 표준 에러 출력을 효과적으로 관리하는 능력은 보다 전문적이고 유지 관리 가능한 Linux 애플리케이션을 개발하는 데 도움이 될 것입니다.



