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

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

여러 Bash 쉘 스크립트를 병렬로 실행하고 싶습니다. 그러나 경쟁 조건을 피하고 싶습니다. 유닉스 명령이란 무엇입니까?정말이 목적으로 어떤 원자를 사용할 수 있으며 어떻게 사용합니까?

답변1

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

이렇게 하면 "("와 ")" 사이의 코드가 한 번에 하나의 프로세스에 의해서만 실행되고 해당 프로세스가 너무 오랫동안 잠금을 기다리지 않게 됩니다.

답변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개 시스템에 이 기능이 있었고, 1개 시스템에는 사용할 수 있었습니다.

그것을 사용하는 것은 간단합니다:

#!/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초 동안 매초마다 재시도하도록 합니다. 영원히 기다리게 하려면 "-r" 플래그를 제거하십시오.

답변4

어쩌면 lockfile 명령이 귀하의 필요에 맞을 수도 있습니다.

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

관련 정보