스크립트 장인

ShellBeginner
지금 연습하기

소개

시스템 관리자 지망생 여러분, 환영합니다! 여러분은 이제 막 활기찬 기술 기업의 주니어 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]"과 같은 메시지를 표시합니다.

요구 사항

  • 스크립트는 /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 엔지니어 또는 시스템 관리자로서의 여정에서 큰 발걸음입니다. 여기서 연습한 기술들은 서버 관리, 애플리케이션 배포, 데이터 처리를 수행하는 훨씬 더 복잡한 자동화 스크립트를 작성하기 위한 기초가 됩니다. 여러분은 책임을 다하고 작동하는 솔루션을 제공할 수 있음을 증명했습니다. 잘하셨습니다!

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