
여러 Bash 쉘 스크립트를 병렬로 실행하고 싶습니다. 그러나 경쟁 조건을 피하고 싶습니다. 유닉스 명령이란?진심으로이 목적으로 사용할 수 있는 원자는 무엇이며 어떻게 사용할 수 있나요?
답변1
#!/bin/bash
# Makes sure we exit if flock fails.
set -e
(
# Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
flock -x -w 10 200
# Do stuff
) 200>/var/lock/.myscript.exclusivelock
이렇게 하면 "("와 ")" 사이의 코드가 한 번에 하나의 프로세스에서만 실행되고 프로세스가 잠금을 너무 오래 기다리게 됩니다.
답변2
lockfile
가 시스템에 설치되어 있지 않으면 작업 을 수행합니다. 이는 원자성 작업이며 디렉터리가 이미 있으면 실패합니다( 명령줄 스위치를 mkdir
추가하지 않는 한 ).-p
create_lock_or_wait () {
path="$1"
wait_time="${2:-10}"
while true; do
if mkdir "${path}.lock.d"; then
break;
fi
sleep $wait_time
done
}
remove_lock () {
path="$1"
rmdir "${path}.lock.d"
}
답변3
lockfile(1)은 좋은 후보처럼 보이지만 이것이프로메일아직 컴퓨터에 설치되지 않았을 수 있는 패키지입니다. 아직 설치되지 않은 경우 시스템에 맞게 패키지해야 할 만큼 인기 있는 패키지입니다. 내가 확인한 4개의 시스템 중 3개에는 이 기능이 있고 나머지 하나에는 사용 가능합니다.
그것을 사용하는 것은 간단합니다:
#!/bin/sh
LOCKFILE=$HOME/.myscript/lock
mkdir -p `dirname $LOCKFILE`
echo Waiting for lock $LOCKFILE...
if lockfile -1 -r15 $LOCKFILE
then
# Do protected stuff here
echo Doing protected stuff...
# Then, afterward, clean up so another instance of this script can run
rm -f $LOCKFILE
else
echo "Failed to acquire lock! lockfile(1) returned $?"
exit 1
fi
내가 제공한 옵션은 최대 15초 동안 1초에 한 번씩 재시도하도록 합니다. 영원히 기다리려면 "-r" 플래그를 삭제하세요.
답변4
어쩌면 lockfile 명령이 필요한 작업을 수행할 수도 있습니다.
lockfile ~/.config/mylockfile.lock
.....
rm -f important.lock