모든 종료 경로용 정리
trap 'echo cleaning up; rm -f "$lock"' EXITtrap 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, 운영체제 서비스 매니저처럼 소유권을 더 분명히 하는 수단을 골라.