Linux 출력 멀티플렉싱

LinuxBeginner
지금 연습하기

소개

Linux 의 tee 명령어는 터미널에서 명령의 출력을 보면서 동시에 파일을 저장할 수 있는 강력한 유틸리티입니다. 이 기능은 실시간으로 출력을 검사하고 나중에 분석하기 위해 보존해야 하는 시스템 관리자 및 개발자에게 특히 유용합니다.

이 랩에서는 tee 명령어를 사용하여 출력 멀티플렉싱의 기본 사항을 소개합니다. 출력을 표시하고 동시에 저장하는 방법, 표준 에러를 리디렉션하는 방법, 기존 파일에 출력을 추가하는 방법을 배우게 됩니다. 이러한 기술은 Linux 환경에서 효과적인 로그 관리, 디버깅 및 시스템 모니터링에 필수적입니다.

tee 명령어 기본 이해

Linux 의 tee 명령어는 배관에서 물의 흐름을 두 방향으로 나누는 T 자형 파이프 피팅에서 이름을 따왔습니다. 마찬가지로, tee 명령어는 명령의 출력을 두 방향으로 나눕니다: 터미널과 파일로.

작업 디렉토리로 이동하는 것부터 시작해 보겠습니다:

cd /home/labex/project

테스트 파일 생성

먼저, 실험에 사용할 간단한 텍스트 파일을 만들어 보겠습니다:

echo "Hello, World" > hello.txt

이 명령어는 "Hello, World" 텍스트가 포함된 hello.txt라는 파일을 생성합니다.

tee 명령어 사용

이제 tee 명령어를 사용하여 hello.txt의 내용을 터미널에 표시하는 동시에 다른 파일에 복사해 보겠습니다:

cat hello.txt | tee copy.txt

터미널에서 다음과 같은 출력을 볼 수 있습니다:

Hello, World

cat hello.txt 부분은 hello.txt 파일의 내용을 읽습니다. 파이프 기호 |는 해당 출력을 가져와 tee 명령어로 보냅니다. 그런 다음 tee 명령어는 텍스트를 터미널에 표시하고 동시에 copy.txt 파일에 씁니다.

내용이 실제로 copy.txt에 복사되었는지 확인해 보겠습니다:

cat copy.txt

동일한 출력을 볼 수 있습니다:

Hello, World

명령어 구조 이해

tee 명령어의 기본 구문은 다음과 같습니다:

command | tee filename

여기서:

  • command는 출력을 생성하는 모든 명령어입니다.
  • | (파이프) 는 명령어의 출력을 tee 로 보냅니다.
  • tee는 명령어 자체입니다.
  • filename은 출력이 저장될 파일의 이름입니다.

tee 를 이용한 표준 에러 리디렉션

Linux 에서 프로그램은 두 가지 주요 채널을 통해 정보를 출력할 수 있습니다:

  • 표준 출력 (stdout): 일반 프로그램 출력
  • 표준 에러 (stderr): 에러 메시지 및 진단 정보

기본적으로 tee 명령어는 표준 출력만 캡처합니다. 그러나 많은 상황에서 에러 메시지도 캡처하고 싶을 수 있습니다. 이럴 때 출력 리디렉션이 필요합니다.

표준 에러 리디렉션 이해

표준 출력과 표준 에러를 모두 출력하는 스크립트를 만들어 보겠습니다. 먼저 프로젝트 디렉토리로 이동합니다 (아직 이동하지 않은 경우):

cd /home/labex/project

이제 표준 출력과 표준 에러를 모두 생성하는 명령을 실행해 보겠습니다:

echo "This is standard output"
ls /nonexistentfile

다음과 유사한 출력을 볼 수 있습니다:

This is standard output
ls: cannot access '/nonexistentfile': No such file or directory

ls 명령어의 에러 메시지가 터미널로 직접 전달되는 것을 확인하세요.

표준 에러를 파일로 리디렉션

먼저 에러 출력만 파일로 리디렉션하는 방법을 살펴보겠습니다:

echo "This is standard output"
ls /nonexistentfile 2> error.log

이번에는 다음만 볼 수 있습니다:

This is standard output

에러 메시지가 error.log 파일로 리디렉션되었습니다. 2> 구문은 셸에게 표준 에러 (파일 디스크립터 2) 를 지정된 파일로 리디렉션하도록 지시합니다.

error.log의 내용을 확인해 보겠습니다:

cat error.log

다음과 같은 내용을 볼 수 있습니다:

ls: cannot access '/nonexistentfile': No such file or directory

tee 로 출력과 에러 모두 캡처

이제 tee를 사용하여 표준 출력과 표준 에러를 모두 파일에 캡처하는 동시에 터미널에 표시해 보겠습니다:

{
  echo "This is standard output"
  ls /nonexistentfile
} 2>&1 | tee both.log

터미널에서 출력과 에러를 모두 볼 수 있습니다:

This is standard output
ls: cannot access '/nonexistentfile': No such file or directory

both.log의 내용을 확인해 보겠습니다:

cat both.log

동일한 출력을 볼 수 있습니다:

This is standard output
ls: cannot access '/nonexistentfile': No such file or directory

명령어 구조 이해

2>&1 | tee both.log 명령어에서:

  • { ... }는 여러 명령어를 함께 그룹화합니다.
  • 2>&1은 표준 에러 (파일 디스크립터 2) 를 표준 출력 (파일 디스크립터 1) 으로 리디렉션합니다.
  • |는 결합된 출력을 tee 명령어에 파이프합니다.
  • tee both.log는 출력을 터미널에 표시하고 both.log에 씁니다.

이 기술은 시스템 유지 관리 또는 문제 해결 중에 명령 출력을 로깅하는 데 특히 유용합니다.

tee 를 이용한 출력 추가 (Append)

기본적으로 tee 명령어는 사용될 때마다 대상 파일을 덮어씁니다. 그러나 많은 시나리오에서 내용을 바꾸는 대신 기존 파일에 새로운 정보를 추가하고 싶을 수 있습니다. 이럴 때 -a (추가) 옵션이 유용합니다.

추가 옵션 이해

아직 프로젝트 디렉토리에 있지 않다면 이동합니다:

cd /home/labex/project

먼저 시스템 정보가 있는 파일을 만들어 보겠습니다:

uname -a | tee system_info.log

이 명령어는 터미널에 시스템 정보를 표시하고 system_info.log에 저장합니다. 출력은 다음과 유사하게 보일 것입니다 (출력은 다를 수 있습니다):

Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

이제 파일의 내용을 확인해 보겠습니다:

cat system_info.log

동일한 시스템 정보를 볼 수 있습니다.

파일에 정보 추가하기

이제 -a 옵션을 사용하여 이 파일에 더 많은 정보를 추가해 보겠습니다:

echo "Date and time: $(date)" | tee -a system_info.log

이것은 다음과 유사한 내용을 표시합니다:

Date and time: Wed May 3 14:22:34 UTC 2023

-a 플래그는 tee에게 출력을 덮어쓰는 대신 파일에 추가하도록 지시합니다.

파일의 내용을 다시 확인해 보겠습니다:

cat system_info.log

이제 시스템 정보와 날짜를 모두 볼 수 있습니다:

Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Date and time: Wed May 3 14:22:34 UTC 2023

더 많은 정보 추가하기

로그 파일에 더 많은 정보를 추가해 보겠습니다:

echo "Disk usage:" | tee -a system_info.log
df -h | tee -a system_info.log

이것은 디스크 사용량 정보를 표시하고 로그 파일에 추가합니다. 출력은 시스템에 따라 다르지만 다음과 유사하게 보일 수 있습니다:

Disk usage:
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        19G  5.8G   13G  32% /
tmpfs           494M     0  494M   0% /dev/shm
tmpfs           198M  1.1M  197M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda15      105M  5.2M  100M   5% /boot/efi
tmpfs           100M  4.0K  100M   1% /run/user/1000

로그 파일의 내용을 다시 한 번 확인해 보겠습니다:

cat system_info.log

이제 추가한 모든 정보를 볼 수 있습니다:

Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Date and time: Wed May 3 14:22:34 UTC 2023
Disk usage:
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        19G  5.8G   13G  32% /
tmpfs           494M     0  494M   0% /dev/shm
tmpfs           198M  1.1M  197M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda15      105M  5.2M  100M   5% /boot/efi
tmpfs           100M  4.0K  100M   1% /run/user/1000

명령어 구조 이해

tee로 추가하는 구문은 다음과 같습니다:

command | tee -a filename

여기서:

  • command는 출력을 생성하는 모든 명령어입니다.
  • | (파이프) 는 명령어의 출력을 tee로 보냅니다.
  • tee는 명령어 자체입니다.
  • -a는 파일을 덮어쓰는 대신 추가하는 옵션입니다.
  • filename은 출력이 추가될 파일의 이름입니다.

이 접근 방식은 특히 다음과 같은 경우에 유용합니다:

  • 시간에 따라 로그 파일 구축
  • 여러 명령의 출력을 단일 파일에 캡처
  • 시스템 상태 또는 작업 기록 유지

요약

이 랩에서는 Linux 에서 출력 멀티플렉싱 (output multiplexing) 을 위해 tee 명령어를 사용하는 방법을 배웠습니다. 이 강력한 유틸리티를 사용하면 터미널에서 명령 출력을 보면서 동시에 파일을 저장할 수 있으며, 이는 시스템 관리자 및 개발자에게 필수적인 도구입니다.

다음은 습득한 주요 기술입니다:

  1. tee 의 기본 사용법: tee를 사용하여 터미널에 출력을 표시하는 동시에 파일을 저장하는 방법을 배웠습니다.

  2. 표준 에러 리디렉션: 포괄적인 로깅 (logging) 에 중요한 tee와 함께 2>&1 리디렉션을 사용하여 표준 출력과 표준 에러를 모두 캡처하는 방법을 익혔습니다.

  3. 출력 추가: -a 옵션을 tee와 함께 사용하여 기존 파일을 덮어쓰는 대신 출력 내용을 추가하는 방법을 익혔으며, 이를 통해 로그를 점진적으로 구축할 수 있습니다.

이러한 기술은 다음과 같은 Linux 의 다양한 작업에 유용합니다:

  • 디버깅을 위한 상세한 로그 생성
  • 시스템 활동 모니터링
  • 시스템 관리 중 명령 출력 문서화
  • 향후 참조를 위해 명령 결과 보존

Linux 에서 출력을 효과적으로 관리하는 방법을 이해하는 것은 Linux 시스템 여정에서 발전하는 데 도움이 되는 기본적인 기술입니다.