Bash/셸에서 지속적인 프로세스 간 카운터를 증가시키는 방법

Bash/셸에서 지속적인 프로세스 간 카운터를 증가시키는 방법

다음은 내가 하려는 작업에 대한 최소한의 예입니다.

# If it does not exist, create a file to persist the unique identifier
if [ ! -f ~/.uid ]; then
   echo 0 > ~/.uid
fi

# Increment the unique identifier in the ~/.uid file
echo 1 + $(<~/.uid) | bc > ~/.uid

# Launch expensive computation that uses this unique identifier
uid=$(<~/.uid)
do_something_long $uid

그 외에도 스크립트의 여러 인스턴스가 동시에 실행될 수 있으며 do_something_long은 고유 식별자(사람이 읽을 수 있는 것이 바람직하므로 0 또는 1부터 시작)를 사용하여 호출해야 합니다.

잠금을 얻기 위해 클러스터링(1)을 사용해 보았지만 대부분의 보안 예제에서는 하위 쉘을 사용하여 파일 설명자를 바인딩하므로 상위 쉘의 고유 식별자에 액세스할 수 없습니다. 그리고 서브셸에서 do_something_long을 수행하고 싶지 않습니다. 너무 오랫동안 잠금을 유지하기 때문입니다.

답변1

설명하신 내용과 거의 비슷한 것 같습니다. 먼저 서브셸에서 실행되는 함수를 정의합니다.

getuid() (
    flock 9
    oldid=$(<~/.uid)
    newid=$((oldid+1))
    echo $newid >&9
    echo $newid
) 9<>~/.uid

myuid=$(getuid)그럼 새로운 아이디가 필요할 때 사용해보세요.

관련 정보