Locking Shell Script

스크립트 가 중복 되어서 실행 될 수 있는 경우 예상치 못한 문제 문제 들이 발생할 수. 따라서 스크립트 가 실행 되고 되고 경우 동일한 스크립트 가 실행 되지 않도록 하는 장치 를 마련해야 하는데, 이게 말 처럼 쉬운 일은 아니다.

이때 일반적 으로 사용 하는 것이 파일 을 이용한 bloqueio 인데, 일반적 으로 toque 등 을 이용 하여 파일 을 만들고 이 파일 을 bloqueio 으로 이용한다. 하지만 이러한 방법 은 내부적 으로 1. 파일 이 있는지 체크 를 하고, 2. 없는 경우 파일 을 을 생성 하는 알고리즘 을. 보시 다시피 이건 atomic 이 아님!

이에 대한 대안 으로 사용할 수 있는 것이 mkdir 이다. mkdir 은 파일 을 생성 하는 명령어 와 는 다르게 디렉터리 생성 시 디렉터리 가 있으면 에러 가 발생 하게 된다. 이를 이용 해서 operação atômica 을 보장 한다는 것인데, 실제 사용 예제 를 보면 어려운 내용 은 아니다.

# locking example -- CORRECT
# Bourne
lockdir
=/tmp/myscript.lock
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
echo
>&2 "successfully acquired lock: $lockdir"
# continue script
else
echo
>&2 "cannot acquire lock, giving up on $lockdir"
exit 0
fi

위와 같이 mkdir 사용 을 통해서 nível do kernel 의 원 자성 을 보장 할 수 있다.

스크립트 의 수행 이 종료 되었을 때 자동 으로 bloqueio 을 삭제 하는 방법 까지 포함한 예제 는 다음 과 같다.

# POSIX (maybe Bourne?)
lockdir
=/tmp/myscript.lock
if mkdir "$lockdir"
then
echo
>&2 "successfully acquired lock"

# Remove lockdir when the script finishes, or when it receives a signal
trap
'rm -rf "$lockdir"' 0 # remove directory when script finishes

# Optionally create temporary files in this directory, because
# they will be removed automatically:
tmpfile
=$lockdir/filelist

else
echo
>&2 "cannot acquire lock, giving up on $lockdir"
exit 0
fi

여기서 좀 더 나가면 쉘 스크립트 가 정상적으로 종료 되지 않은 경우 (ex. Kill -9) 에 발생할 수 있는 bloqueio obsoleto 처리 까지 생각할 수 있을 텐데, 일단 이정도 만으로도 일반적인 동시성 문제 는 상당 부분 해소 할 수 있을 것이라 생각 한다.

참조

Bloqueio obsoleto 과 관련된 처리 가 필요 하다면 …