DAY 10: 스크립트 장인

LinuxBeginner
지금 연습하기

소개

예비 시스템 관리자 여러분, 환영합니다! 여러분은 이제 막 바쁜 IT 기업의 주니어 DevOps 엔지니어로 입사했습니다. 선임 동료가 휴가를 떠난 사이, 중요한 업무가 여러분의 책상에 떨어졌습니다. 메인 애플리케이션 서버가 수많은 로그 파일을 생성하고 있으며, 이 파일들이 디스크 공간을 빠르게 차지하고 있습니다. 이 임무를 수락한다면, 여러분은 **스크립트 장인(The Script Artisan)**이 되어야 합니다.

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

이제 스크립팅을 시작해 봅시다!

중요 공지
이어지는 챌린지는 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: daily_backup
Backing up logs to: daily_backup

스크립트는 "Enter the backup filename:" 프롬프트에서 멈춰서 사용자가 이름을 입력하고 Enter 키를 누를 때까지 기다려야 합니다. 사용자가 입력을 제공하면 입력된 값을 사용하여 확인 메시지를 표시합니다. 이 챌린지에서 해당 값은 출력에 표시되는 실행 라벨이며, 실제 백업 작업은 4단계에서 .log 파일을 ~/project/backups로 복사하여 구현됩니다.

힌트

  • 변수를 정의하려면 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가 존재하고 디렉토리인 경우 참(true)을 반환합니다.
  • exit 1은 스크립트가 오류로 종료되었음을 알리는 표준적인 방법입니다.

파일 작업을 위한 반복문 사용하기

이제 자동화의 핵심입니다! 로그 디렉토리 내의 파일들을 처리해야 합니다. for 반복문을 사용하여 app_logs 디렉토리 내의 .log로 끝나는 모든 파일을 순회합니다. 이번 챌린지에서는 단순히 새로운 백업 디렉토리로 복사합니다. BACKUP_FILENAME 입력은 스크립트가 생성하는 아카이브 파일이 아니라 출력에 표시되는 실행 라벨로 유지됩니다.

작업

  • 먼저 ~/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: daily_backup
Backing up logs to: daily_backup
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 <source> <destination>입니다.
  • 반복문 변수(예: file)는 각 반복마다 파일의 전체 경로를 보유합니다.

요약

축하합니다, 스크립트 장인님! 처음부터 완전하고 기능적인 셸 스크립트를 성공적으로 구축했습니다. 로그 파일 관리라는 실제 문제를 해결하고 자동화의 힘을 활용했습니다.

이번 챌린지에서 여러분은 셸 스크립팅의 몇 가지 기본 개념을 마스터했습니다:

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

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

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