it-swarm-ko.tech

세마포어 / 잠금으로 사용할 수있는 Unix 명령은 무엇입니까?

여러 개의 Bash Shell 스크립트를 병렬로 실행하고 싶습니다. 그러나 경쟁 조건을 피하고 싶습니다. 이 목적으로 사용할 수있는 유닉스 명령은 truly 원자이며, 어떻게 사용합니까?

39
Larry Wang

시스템에 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"
}
35
Riccardo Murri

flock(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

이렇게하면 "("과 ")"사이의 코드가 한 번에 하나의 프로세스 만 실행되고 프로세스가 잠금을 너무 오래 기다리게됩니다.

30
Alex B

lockfile (1)은 좋은 후보처럼 보이지만 procmail 패키지의 일부이므로 아직 컴퓨터에 설치하지 않았을 수 있습니다. 아직 설치되지 않은 경우 시스템에 맞게 패키지화해야하는 인기있는 패키지입니다. 내가 확인한 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"플래그를 삭제하십시오.

12
Warren Young

시스템 호출 mkdir()은 POSIX 파일 시스템에서 원자 적입니다. 따라서 mkdir 명령을 사용하면 mkdir()을 정확히 한 번만 호출하여 목적을 달성 할 수 있습니다. (IOW, mkdir -p를 사용하지 마십시오). 해당 잠금 해제는 물론 rmdir입니다.

주의 사항 : mkdir()은 네트워크 파일 시스템에서 원자가 아닐 수 있습니다.

7
Hari

아마도 lockfile 명령이 필요한 것을 할 것입니다.

lockfile ~/.config/mylockfile.lock
.....
rm -f important.lock
3
jacksonh

유닉스에서만 실행중인 경우 fifo를 사용하십시오. 작업 레코드를 fifo에 기록하고이 파일에서 프로세스를 읽도록하면 독자가 fifo를 차단합니다.

잠금 파일은 정상이지만 설명에 대해서는 fifo를 사용합니다.

1
Chris

여기에 게시 된대로 : " 쉘 스크립트에서 올바른 잠금? ", FLOM (Free LOck Manager) 도구를 사용하여 명령 및 쉘 스크립트를 직렬화하는 것이 실행하는 것만 큼 쉬워집니다.

flom -- command_to_serialize

FLOM을 사용하면 다음과 같이보다 실용적인 사용 사례 (분산 잠금, 리더/라이터, 숫자 리소스 등)를 구현할 수 있습니다. http://sourceforge.net/p/flom/wiki/FLOM%20by % 20examples /

0
tiian