다음은 내가 하려는 작업에 대한 최소한의 예입니다.
# 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)
그럼 새로운 아이디가 필요할 때 사용해보세요.