0Pricing
Linux Server Deployment & SSH Mastery · 강의

스크립트의 오류 처리 및 로깅

강력한 오류 처리를 구현하고 스크립트 출력을 재지정하며, 스크립트 실행을 모니터링하고 문제를 해결할 수 있는 의미 있는 로그를 생성합니다.

스크립트의 오류 처리 및 로깅은(는) CoddyKit의 무료 Linux Server Deployment & SSH Mastery 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Linux Server Deployment & SSH Mastery 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Linux Server Deployment & SSH Mastery 강의에는 총 4개의 강의가 포함되어 있습니다.

스크립트 안정성 높이기

서버에서 스크립트가 실행되며 중요한 작업을 수행한다고 상상해 보십시오. 무언가 잘못되면 어떻게 될까요?

  • 아무런 알림 없이 실패하나요?
  • 뒤처리를 남기나요?
  • 실패한 시점과 이유를 알 수 있나요?

견고한 스크립트는 오류를 적절히 처리하고 명확한 로그를 제공합니다. 이 레슨에서 그 방법을 배워 보겠습니다!

종료 코드 이해하기

Linux의 모든 명령과 스크립트는 실행을 마칠 때 종료 코드(또는 종료 상태)를 반환합니다. 이 숫자를 통해 성공했는지 실패했는지 알 수 있습니다.

  • 0: 성공을 의미합니다! 모든 작업이 정상적으로 완료되었습니다.
  • 1-255: 실패를 의미합니다. 특정 숫자는 오류 유형을 나타낼 수 있습니다.

실제로 어떻게 작동하는지 살펴보겠습니다.

#!/bin/bash
# This script demonstrates exit codes

echo "Attempting a successful command..."
ls /tmp
echo "Exit code for 'ls /tmp': $?"

echo

echo "Attempting a failing command..."
ls /nonexistent_directory
echo "Exit code for 'ls /nonexistent_directory': $?"

명령 상태 확인하기

명령이 실행된 후에는 특수 변수 $?를 사용하여 종료 코드를 확인할 수 있습니다. 이는 스크립트에서 결정을 내릴 때 매우 유용합니다.

if 문을 사용하여 성공 또는 실패에 대응할 수 있습니다.

#!/bin/bash
# Check if a file exists before trying to read it

FILENAME="test_file.txt"
touch $FILENAME # Create it for success case

if [ -f "$FILENAME" ]; then
  echo "File '$FILENAME' exists. Processing..."
  # ... do something with the file ...
  rm $FILENAME # Clean up
else
  echo "Error: File '$FILENAME' not found!"
  exit 1
fi

echo "Script finished."

`set -e`: 오류 발생 시 종료

간단한 스크립트에서 매번 $?를 직접 확인하는 일은 번거로울 수 있습니다. set -e 명령은 스크립트의 동작을 다음과 같이 변경합니다.

  • 어떤 명령이든 0이 아닌 상태로 종료되면(실패하면) 스크립트가 즉시 종료됩니다.
  • 따라서 스크립트가 손상되었을 가능성이 있는 데이터나 잘못된 상태를 계속 처리하는 일을 방지할 수 있습니다.

이 스크립트를 실행해 보십시오. cp 명령이 실패하면 어떻게 될까요?

#!/bin/bash
set -e

echo "Starting important operations..."
mkdir my_temp_dir
cp /nonexistent_source my_temp_dir/target # This will fail

echo "This line will not be reached if cp fails."
rmdir my_temp_dir
echo "Script finished successfully."

정리 작업을 위한 `trap`

스크립트가 실패하더라도 임시 파일 삭제와 같은 정리 작업을 수행해야 하는 경우가 있습니다. trap 명령을 사용하면 신호(종료나 오류 등)를 포착하여 명령을 실행할 수 있습니다.

  • EXIT: 성공 여부와 관계없이 스크립트가 종료될 때 실행됩니다.
  • ERR: 명령이 0이 아닌 상태로 종료될 때 실행됩니다(set -e가 활성화된 경우).

여기서는 임시 디렉터리가 항상 삭제되도록 합니다.

#!/bin/bash

TEMP_DIR="/tmp/my_script_temp_$(date +%s)"

function cleanup {
  echo "Cleaning up temporary directory: $TEMP_DIR"
  rm -rf "$TEMP_DIR"
}

trap cleanup EXIT

mkdir "$TEMP_DIR"
echo "Working in $TEMP_DIR..."
# Simulate some work, maybe it fails
# cp /nonexistent_file "$TEMP_DIR/" # Uncomment to test failure

echo "Script completed."

출력 리디렉션

스크립트를 실행하면 메시지가 출력되는 경우가 많습니다. 이러한 메시지는 크게 두 가지 유형으로 나뉩니다.

  • 표준 출력(stdout): 일반 메시지(파일 디스크립터 1)
  • 표준 오류(stderr): 오류 메시지(파일 디스크립터 2)

이러한 스트림을 화면 대신 파일로 리디렉션할 수 있습니다.

  • command > file: 표준 출력을 file로 리디렉션합니다.
  • command 2> file: 표준 오류를 file로 리디렉션합니다.

성공 메시지와 오류 메시지를 따로 저장해 보겠습니다.

#!/bin/bash
# Redirect stdout to success.log and stderr to error.log

echo "This is a success message." > success.log
ls /nonexistent_path 2> error.log

echo "Check success.log and error.log files."
# To view them after running:
# cat success.log
# cat error.log

모든 출력을 하나의 파일로 보내기

검토하기 쉽도록 표준 출력과 표준 오류를 하나의 로그 파일에 함께 저장하면 유용한 경우가 많습니다. 이렇게 하는 방법은 몇 가지가 있습니다.

  • command > file 2>&1: 표준 출력을 file로 리디렉션한 다음, 표준 오류를 표준 출력이 향하는 곳(파일)으로 리디렉션합니다.
  • command &> file: 같은 작업을 수행하는 더 짧고 현대적인 문법입니다.

이 방법은 스크립트 실행 과정을 종합적으로 기록하는 로그를 만들 때 유용합니다.

#!/bin/bash
# Redirect both stdout and stderr to a single log file

LOG_FILE="combined_script.log"

echo "Starting script..." &> "$LOG_FILE"
echo "This message goes to stdout." &>> "$LOG_FILE"
ls /nonexistent_dir 2>&1 | tee -a "$LOG_FILE"
echo "Script finished." &>> "$LOG_FILE"

echo "Check the '$LOG_FILE' file for all output."

로그에 타임스탬프 추가하기

디버깅할 때는 이벤트가 발생한 시점을 아는 것이 매우 중요합니다. 로그 메시지에 타임스탬프를 추가하면 로그를 훨씬 유용하게 활용할 수 있습니다.

date 명령을 사용하여 각 로그 항목 앞에 현재 날짜와 시간을 추가할 수 있습니다. 그러면 이벤트를 시간순으로 추적하는 데 도움이 됩니다.

#!/bin/bash

LOG_FILE="timestamped_script.log"

function log_message {
  echo "$(date +%Y-%m-%d_%H:%M:%S) - $1" &>> "$LOG_FILE"
}

log_message "Script started."
sleep 1
log_message "Performing task A..."
# Simulate an error
ls /no_such_place || log_message "Error: Command failed."
sleep 1
log_message "Script finished."

echo "Check '$LOG_FILE' for timestamped entries."

`logger`로 시스템 로그에 보내기

중요한 이벤트가 발생하면 메시지를 시스템의 로깅 기능(syslog)으로 직접 보내고 싶을 수 있습니다. logger 명령이 바로 이 작업을 수행합니다.

  • 시스템 로그는 journalctl과 같은 도구로 관리되는 경우가 많습니다(systemd 시스템에서).
  • 이렇게 하면 스크립트의 중요한 메시지를 다른 시스템 이벤트와 함께 중앙에서 관리할 수 있습니다.
  • 중대한 오류나 감사 추적 기록에 유용합니다.

logger로 보낸 메시지는 시스템에 따라 journalctl -f 또는 tail -f /var/log/syslog를 사용하여 확인할 수 있습니다.

#!/bin/bash
# Send a message to system logs

SCRIPT_NAME="MyBackupScript"

logger -t "$SCRIPT_NAME" "Starting daily backup operation."

# Simulate a task
sleep 2
if [ $(($RANDOM % 2)) -eq 0 ]; then
  logger -t "$SCRIPT_NAME" -p user.info "Backup successful."
else
  logger -t "$SCRIPT_NAME" -p user.err "Backup failed: Disk full."
fi

echo "Messages sent to system logs. Check with 'journalctl -t $SCRIPT_NAME'."

오류 처리 확인

일부 파일을 처리하는 Bash 스크립트를 작성했다고 가정해 보겠습니다. 스크립트 내부의 명령 중 하나라도 실패하면 즉시 종료하고, 스크립트가 어떤 방식으로 종료되든 임시 디렉터리를 정리하려고 합니다.

이를 위해 주로 사용할 Bash 명령 두 가지는 무엇일까요?

복습 및 다음 단계

Bash 스크립트를 더욱 견고하고 디버깅하기 쉽게 만드는 방법을 배웠습니다!

  • 종료 코드: 명령의 성공 또는 실패를 파악합니다.
  • set -e: 오류 발생 시 자동으로 종료합니다.
  • trap: 스크립트가 종료될 때 정리 작업을 수행합니다.
  • 출력 리디렉션: 표준 출력과 표준 오류가 향하는 곳을 제어합니다.
  • 타임스탬프: 로그에 상황 정보를 추가합니다.
  • logger: 시스템 전체의 로깅 기능과 연동합니다.

이러한 기법을 적용하면 자동화 작업을 더욱 안정적이고 관리하기 쉽게 만들 수 있습니다. 계속 연습하여 진정으로 견고한 자동화를 구축해 보십시오!

자주 묻는 질문

“스크립트의 오류 처리 및 로깅” 강의는 무료인가요?

네 — “스크립트의 오류 처리 및 로깅” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Linux Server Deployment & SSH Mastery 강의 전체를 잠금 해제할 수 있습니다. Linux Server Deployment & SSH Mastery 강의에는 총 4개의 강의가 포함되어 있습니다.

“스크립트의 오류 처리 및 로깅”에서 뭘 배우나요?

강력한 오류 처리를 구현하고 스크립트 출력을 재지정하며, 스크립트 실행을 모니터링하고 문제를 해결할 수 있는 의미 있는 로그를 생성합니다. 브라우저에서 직접 실행하는 실습 코드로 Linux Server Deployment & SSH Mastery을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Linux Server Deployment & SSH Mastery을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Linux Server Deployment & SSH Mastery은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“스크립트의 오류 처리 및 로깅” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Linux Server Deployment & SSH Mastery 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Linux Server Deployment & SSH Mastery 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Bash 스크립팅 입문
  2. 서버 작업 자동화
  3. 스크립트의 오류 처리 및 로깅
  4. 함수, 인수와 재사용 가능한 스크립트
← Linux Server Deployment & SSH Mastery(으)로 돌아가기