DAY 10: 스크립트의 장인

LinuxBeginner
지금 연습하기

소개

미래의 시스템 관리자 여러분, 환영합니다! 여러분은 이제 막 유망한 기술 기업의 주니어 데브옵스 엔지니어로 합류했습니다. 선임 동료가 꿀맛 같은 휴가를 떠난 사이, 여러분의 책상 위로 중요한 업무가 하나 떨어졌습니다. 메인 애플리케이션 서버에서 수많은 로그 파일이 생성되고 있으며, 이 파일들이 디스크 공간을 빠르게 차지하고 있습니다. 여러분의 임무는 바로 스크립트의 장인이 되어 이 상황을 해결하는 것입니다.

여러분은 이 로그 파일들을 관리하기 위한 자동화된 쉘 스크립트를 만들어야 합니다. 단순히 몇 개의 명령어를 실행하는 것이 아니라, 견고하고 재사용 가능한 도구를 구축하는 것이 목표입니다. 간단한 스크립트에서 시작하여 변수, 사용자 입력, 오류 확인, 반복문과 같은 기능을 단계적으로 추가해 나갈 것입니다. 이 챌린지를 마칠 때쯤이면 파일을 백업하고 관리할 수 있는 멋진 스크립트를 완성하게 될 것이며, 팀 내에서 여러분의 가치를 증명하고 위기를 멋지게 해결하게 될 것입니다!

그럼, 스크립트 작성을 시작해 볼까요?

주의 사항
이번 챌린지는 Quick Start with Linux 과정의 범위를 벗어나는 내용을 포함할 수 있습니다.
챌린지 수행 중 어려움을 겪는다면:
  1. 잠시 챌린지를 건너뛰고 Linux 학습 경로에 있는 다음 가이드 실습을 계속 진행하세요.
  2. Labby 와 상담하거나 모범 답안을 확인하세요.

간단한 쉘 스크립트 작성하기

첫 번째 작업은 기초를 다지는 것입니다. 모든 위대한 스크립트는 단 한 줄에서 시작됩니다. 스크립트 파일을 생성하고 기본 명령어를 추가하여 제대로 작동하는지 확인해야 합니다. 이 초기 단계는 설정이 올바른지, 그리고 더 복잡한 로직을 구축할 준비가 되었는지 확인하는 과정입니다.

과제

  • ~/project 디렉토리에 log_manager.sh라는 이름의 새로운 쉘 스크립트 파일을 생성합니다.
  • 스크립트의 맨 첫 줄에 "쉬뱅 (shebang)" 라인 (#!/bin/bash) 을 추가합니다. 이는 시스템에 어떤 인터프리터를 사용할지 알려주는 역할을 합니다.
  • 화면에 "Log Manager Initialized."라는 메시지를 출력하는 명령어를 추가합니다.
  • chmod +x 명령어를 사용하여 스크립트를 실행 가능하게 만듭니다.

요구 사항

  • 스크립트 이름은 반드시 log_manager.sh여야 합니다.
  • 스크립트는 ~/project 디렉토리에 위치해야 합니다.
  • 첫 번째 줄은 반드시 #!/bin/bash여야 합니다.
  • 스크립트는 echo 명령어를 사용하여 지정된 메시지를 표시해야 합니다.
  • 스크립트는 실행 권한을 가지고 있어야 합니다 (chmod +x log_manager.sh 사용).

예시

스크립트를 생성하고 실행 가능하게 만든 후의 전체 과정은 다음과 같아야 합니다:

먼저, 스크립트 파일이 존재하는지 확인합니다:

ls ~/project/
log_manager.sh

스크립트에 실행 권한을 설정합니다:

chmod +x ~/project/log_manager.sh

이제 스크립트를 실행합니다:

./log_manager.sh

스크립트는 다음과 같이 출력해야 합니다:

Log Manager Initialized.

스크립트 내용이 올바른지도 확인할 수 있습니다:

cat ~/project/log_manager.sh

파일에는 다음 내용이 포함되어야 합니다:

#!/bin/bash

echo "Log Manager Initialized."

힌트

  • nano와 같은 명령줄 텍스트 편집기를 사용하여 파일을 생성하고 편집할 수 있습니다. 예: nano log_manager.sh.
  • echo 명령어는 텍스트 한 줄을 표시하는 데 사용됩니다.
  • 스크립트를 실행 가능하게 만들려면 chmod +x filename을 사용하세요. +x는 파일 소유자에게 실행 권한을 추가합니다.

변수와 사용자 입력 추가하기

값이 고정된 스크립트는 유연성이 떨어집니다. 스크립트를 더 동적이고 재사용 가능하게 만들기 위해 이제 변수를 도입해 보겠습니다. 로그 디렉토리를 위한 변수를 정의하고, 사용자에게 백업 아카이브의 이름을 입력하도록 요청할 것입니다. 이렇게 하면 코드 자체를 수정하지 않고도 다양한 상황에 스크립트를 적응시킬 수 있습니다.

과제

  • log_manager.sh 스크립트를 수정합니다.
  • LOG_DIR이라는 이름의 변수를 정의하고 /home/labex/project/app_logs 경로를 할당합니다.
  • 사용자로부터 입력을 받기 위해 "Enter the backup filename: "이라는 메시지를 출력하는 줄을 추가합니다.
  • read 명령어를 사용하여 사용자의 입력을 BACKUP_FILENAME이라는 새로운 변수에 캡처합니다.
  • 설정 내용을 확인하기 위해 마지막에 echo 명령어를 추가하여 "Backing up logs to: [filename]"과 같은 메시지를 표시합니다. 여기서 [filename]은 사용자가 입력한 값입니다.

요구 사항

  • 스크립트에는 /home/labex/project/app_logs로 설정된 LOG_DIR 변수가 포함되어야 합니다.
  • 스크립트는 사용자로부터 입력을 받기 위해 read 명령어를 사용해야 합니다.
  • 사용자 입력은 BACKUP_FILENAME이라는 변수에 저장되어야 합니다.
  • 최종 출력에는 $BACKUP_FILENAME 변수가 사용되어야 합니다.

예시

수정된 스크립트를 실행하면 사용자 입력을 요청하고 확인 메시지를 표시해야 합니다. 상호작용은 다음과 같은 모습이어야 합니다:

./log_manager.sh
Log Manager Initialized.
Enter the backup filename: my_backup_2024.tar.gz
Backing up logs to: my_backup_2024.tar.gz

스크립트는 "Enter the backup filename:" 프롬프트에서 멈춰서 사용자가 파일 이름을 입력하고 Enter 를 누를 때까지 기다려야 합니다. 사용자가 입력을 제공하면 입력된 파일 이름을 사용하여 확인 메시지를 표시합니다.

힌트

  • 변수를 정의하려면 VARIABLE_NAME="value" 구문을 사용합니다. = 기호 주변에 공백이 없어야 합니다.
  • 변수의 값을 사용하려면 $MY_VARIABLE과 같이 변수 이름 앞에 $ 기호를 붙입니다.
  • read 명령어는 스크립트를 일시 중지하고 사용자가 무언가를 입력하고 Enter 를 누를 때까지 기다립니다.

조건부 로직 구현하기

좋은 스크립트는 문제를 예측합니다. 지정한 로그 디렉토리가 존재하지 않는다면 어떻게 될까요? 스크립트는 실패하게 될 것입니다. 스크립트를 더 견고하게 만들기 위해 조건부 로직을 추가해야 합니다. if 문을 사용하여 작업을 시도하기 전에 로그 디렉토리가 존재하는지 확인해 보겠습니다.

과제

  • log_manager.sh 스크립트를 수정합니다.
  • $LOG_DIR 변수에 지정된 디렉토리가 존재하는지 확인하는 if 문을 추가합니다.
  • 디렉토리가 존재하면 스크립트는 이전과 같이 진행합니다 (파일 이름 요청 등).
  • 디렉토리가 존재하지 않으면, 스크립트는 "Error: Log directory not found."라는 오류 메시지를 출력하고 0 이 아닌 상태 코드로 즉시 종료해야 합니다.

요구 사항

  • 스크립트는 if 문을 사용해야 합니다.
  • 조건문은 -d 테스트 연산자를 사용하여 디렉토리의 존재 여부를 확인해야 합니다.
  • 디렉토리가 존재하지 않으면 스크립트는 지정된 오류 메시지를 echo해야 합니다.
  • 디렉토리가 존재하지 않으면 스크립트는 exit 1을 사용하여 종료되어야 합니다.

예시

로그 디렉토리가 존재할 때 스크립트는 정상적으로 실행되어야 합니다:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: test_backup.tar.gz
Backing up logs to: test_backup.tar.gz

로그 디렉토리가 존재하지 않으면 스크립트는 오류를 표시하고 종료되어야 합니다:

./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.

이 경우 스크립트는 오류 메시지를 표시한 후 사용자 입력을 요청하거나 백업 작업을 진행하지 않고 즉시 종료됩니다.

힌트

  • 기본적인 if 문의 구문은 if [ condition ]; then ... else ... fi입니다.
  • [ -d "$DIRECTORY_PATH" ] 테스트는 $DIRECTORY_PATH가 존재하고 디렉토리인 경우 참을 반환합니다.
  • exit 1은 스크립트가 오류와 함께 종료되었음을 알리는 표준적인 방법입니다.

반복문을 이용한 파일 작업 처리

이제 자동화의 핵심 단계입니다! 로그 디렉토리 내의 파일들을 처리해야 합니다. for 반복문을 사용하여 app_logs 디렉토리에서 .log로 끝나는 모든 파일을 순회할 것입니다. 이번 챌린지에서는 단순히 이 파일들을 새로운 백업 디렉토리로 복사하는 작업을 수행합니다.

과제

  • 먼저, 로그 파일이 복사될 ~/project 내부에 backups라는 이름의 디렉토리를 생성합니다.
  • log_manager.sh 스크립트를 수정합니다.
  • if 블록 내부 (디렉토리 존재가 확인된 곳) 에 for 반복문을 추가합니다.
  • 반복문은 $LOG_DIR 디렉토리 내에서 .log로 끝나는 모든 파일을 대상으로 순회해야 합니다.
  • 반복문 내부에서 cp 명령어를 사용하여 각 로그 파일을 ~/project/backups 디렉토리로 복사합니다.
  • 각 파일이 복사될 때마다 "Copied [filename]"과 같은 메시지를 출력합니다.

요구 사항

  • 먼저 명령줄에서 ~/project/backups 디렉토리를 생성해야 합니다.
  • 스크립트는 for 반복문을 사용해야 합니다.
  • 반복문은 $LOG_DIR 내의 *.log 패턴과 일치하는 파일들을 순회해야 합니다.
  • 반복문 내부에서 cp 명령어를 사용하여 파일을 ~/project/backups로 복사해야 합니다.
  • 각 파일이 복사될 때 echo 문을 사용하여 파일 이름을 보고해야 합니다.

예시

이 단계를 완료한 후 백업 파일 이름과 함께 스크립트를 실행하면 모든 로그 파일을 처리하고 다음과 유사한 출력을 표시해야 합니다:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: full_backup.tar.gz
Backing up logs to: full_backup.tar.gz
Copied /home/labex/project/app_logs/access.log
Copied /home/labex/project/app_logs/debug.log
Copied /home/labex/project/app_logs/error.log
Backup complete.

스크립트는 디렉토리의 각 .log 파일을 순회하며 각 파일에 대해 "Copied" 메시지를 표시해야 합니다. 정확한 파일 이름은 app_logs 디렉토리에 있는 실제 로그 파일에 따라 달라집니다.

스크립트가 완료된 후 backups 디렉토리를 확인하여 파일이 복사되었는지 검증할 수 있습니다:

ls ~/project/backups/
access.log  debug.log  error.log

힌트

  • mkdir 명령어를 사용하여 디렉토리를 생성할 수 있습니다.
  • 파일에 대한 for 반복문은 for file in /path/to/*.log; do ... done과 같이 작성할 수 있습니다.
  • cp 명령어 구문은 cp <원본> <대상>입니다.
  • 반복문 변수 (예: file) 는 각 반복마다 파일의 전체 경로를 가지게 됩니다.

요약

축하합니다, 스크립트의 장인 여러분! 여러분은 처음부터 끝까지 완전하고 기능적인 쉘 스크립트를 성공적으로 구축했습니다. 로그 파일 관리라는 실제적인 문제를 자동화의 힘으로 해결해 냈습니다.

이 챌린지를 통해 여러분은 쉘 스크립팅의 몇 가지 핵심 개념을 마스터했습니다:

  • 쉬뱅을 사용하여 스크립트 생성 및 구조화하기.
  • 변수를 사용하여 스크립트를 동적으로 만들기.
  • read를 사용하여 사용자 입력 캡처하기.
  • if 문을 사용하여 견고한 오류 확인 구현하기.
  • for 반복문을 사용하여 반복적인 작업 자동화하기.
  • 파일 권한 관리 및 스크립트 실행하기.

여러분의 스크립트는 이제 자동으로 로그 디렉토리의 존재 여부를 확인하고, 모든 로그 파일을 처리하여 백업 위치로 복사할 수 있습니다. 이는 데브옵스 엔지니어나 시스템 관리자로서의 여정에서 매우 큰 진전입니다. 여기서 연습한 기술들은 서버를 관리하고, 애플리케이션을 배포하며, 데이터를 처리하는 훨씬 더 복잡한 자동화 스크립트를 작성하는 기초가 됩니다. 여러분은 책임을 다하고 작동하는 솔루션을 제공할 수 있음을 증명했습니다. 정말 잘하셨습니다!

✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습