bash mutex - aragorn/home GitHub Wiki

Q - bash script μ—μ„œ mutex λ˜λŠ” semaphore λ₯Ό μ΄μš©ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•˜λŠ” 것이 쒋을지?

A - 크게 μ„Έ κ°€μ§€ 방법이 μžˆλ‹€.

  • mkdir(1) 을 μ΄μš©ν•˜λŠ” 방법
  • flock(1) 을 μ΄μš©ν•˜λŠ” 방법 - util-linux νŒ¨ν‚€μ§€μ— 포함
  • lockfile(1) 을 μ΄μš©ν•˜λŠ” 방법 - procmail νŒ¨ν‚€μ§€μ— 포함

flock(1)λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 일반적으둜 μ’‹μ•„ λ³΄μ΄λŠ”λ°, μŠ€ν¬λ¦½νŠΈκ°€ 비정상 μ’…λ£Œν•œ 경우, μ–΄λ–»κ²Œ ν–‰λ™ν•˜λŠ”μ§€ μ’€ 더 확인할 ν•„μš”κ°€ μžˆλ‹€. flock(1) 의 경우, ( ... ) 둜 bash μ½”λ“œλ₯Ό λΈ”λŸ­μœΌλ‘œ 감싸야 ν•˜λŠ” μ œμ•½μ΄ μžˆλ‹€. μ΄λŸ¬ν•œ μ œμ•½ λ•Œλ¬Έμ— μ½”λ“œ 길이가 κΈ΄ 경우, ν•¨μˆ˜λ‚˜ μ™ΈλΆ€ λͺ…λ ΉμœΌλ‘œ 뢄리해야 가독성을 확보할 수 μžˆλŠ”λ°, 이에 λŒ€ν•œ μ“Έλ§Œν•œ 예제λ₯Ό λ§Œλ“€ ν•„μš”κ°€ μžˆλ‹€.

참고자료

#!/bin/bash
 
## Copyright (C) 2009  Przemyslaw Pawelczyk <[email protected]>
## License: GNU General Public License v2, v3
#
# Lockable script boilerplate
 
### HEADER ###
 
LOCKFILE="/var/lock/`basename $0`"
LOCKFD=99
 
# PRIVATE
_lock()             { flock -$1 $LOCKFD; }
_no_more_locking()  { _lock u; _lock xn && rm -f $LOCKFILE; }
_prepare_locking()  { eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; }
 
# ON START
_prepare_locking
 
# PUBLIC
exlock_now()        { _lock xn; }  # obtain an exclusive lock immediately or fail
exlock()            { _lock x; }   # obtain an exclusive lock
shlock()            { _lock s; }   # obtain a shared lock
unlock()            { _lock u; }   # drop a lock
 
### BEGIN OF SCRIPT ###
 
# Simplest example is avoiding running multiple instances of script.
exlock_now || exit 1
 
# Remember! Lock file is removed when one of the scripts exits and it is
#           the only script holding the lock or lock is not acquired at all.