스크립트의 오류 처리 및 로깅
강력한 오류 처리를 구현하고 스크립트 출력을 재지정하며, 스크립트 실행을 모니터링하고 문제를 해결할 수 있는 의미 있는 로그를 생성합니다.
스크립트의 오류 처리 및 로깅은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Bash 스크립팅 입문
- 서버 작업 자동화
- 스크립트의 오류 처리 및 로깅
- 함수, 인수와 재사용 가능한 스크립트