본문 바로가기
C.W.K.
Stream
Lesson 10 of 12 · published

트랩: 종료 시 정리

~10 min · trap, cleanup, exit

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

모든 종료 경로용 정리

trap 'echo cleaning up; rm -f "$lock"' EXIT

trap CMD SIGNAL...은 셸이 해당 신호를 처리할 때 CMD를 실행해. EXIT는 셸이 정상적으로 빠져나가는 여러 경로를 한곳에 모으는 의사 신호지만, SIGKILL이나 전원 차단처럼 셸이 실행 기회를 얻지 못하는 상황까지 처리하지는 못해.

흔한 패턴

tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT
# ... $tmpdir 자유롭게 사용. 자동 cleanup

# 락 파일
lock=/tmp/myjob.lock
[[ -e "$lock" ]] && { echo 'already running'; exit 1; }
echo $$ > "$lock"
trap 'rm -f "$lock"' EXIT

다수 시그널

# 종료 정리는 한 번만 실행되도록 구성
cleanup() { rm -rf -- "$tmpdir"; }
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM

# 다른 handler
trap 'echo "caught Ctrl+C"' INT
trap 'echo "normal exit"' EXIT

트랩을 기본값으로 되돌리거나 신호를 무시해

trap - INT는 INT 신호의 처리 방식을 기본값으로 되돌리고, trap '' INT는 INT 신호를 무시하게 해.

트랩 안의 변수는 펼쳐지는 시점을 확인해

trap "rm -f $tmpdir" EXIT처럼 큰따옴표를 쓰면 트랩을 설정하는 순간 $tmpdir가 펼쳐져. 반면 trap 'rm -f "$tmpdir"' EXIT처럼 작은따옴표를 쓰면 트랩이 실행될 때 변수가 펼쳐져. 변수가 나중에 달라질 수 있다면 보통 두 번째 형태가 알맞아.

다음 실행의 복구까지 설계해

임시 디렉터리는 다른 사용자가 쓰지 못하게 만들고, 삭제 경로는 좁고 검증된 값으로 제한하며, 정리 함수는 여러 번 불려도 안전하게 작성해. 잡을 수 없는 종료 때문에 오래된 락이나 부분 결과가 남을 수 있다면 다음 실행이 시작할 때 그 상태를 검증하고 복구해.

락 파일만으로 소유권을 증명할 수는 없어

프로세스가 비정상 종료하면 락 파일이 남을 수 있고, PID는 나중에 재사용될 수도 있어. 단순 락 파일은 작은 개인 스크립트에는 충분하지만 동시 실행이 위험한 작업이라면 mkdir의 원자성, flock, 운영체제 서비스 매니저처럼 소유권을 더 분명히 하는 수단을 골라.

Code

자가 정리 tmp 디렉터리·bash
#!/usr/bin/env bash
set -euo pipefail
tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT
echo "working in $tmpdir"
cp -r src/ "$tmpdir/"
# 종료 경로에서 임시 디렉터리 정리

External links

Exercise

mktemp -d로 임시 디렉터리를 만들고 EXIT 트랩에서 정확한 경로만 제거하는 스크립트를 작성해. 정상 종료와 의도한 실패를 각각 실행해 임시 디렉터리가 정리되는지 확인하고, 제거 대상이 비어 있지 않은지도 트랩 전에 검증해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.