나는 bash 함수에 대해 본 것에서 샘플 bash 스크립트를 생각해 냈습니다 flock
. 나는 다음을 원한다:
func()
{
42>/home/foo
flock -e 42 || exit 1
echo "hello world"
sleep 5
}
그런 다음 연속해서 실행합니다 func&
. 각 항목 hello world
은 즉시 인쇄되며 첫 번째 항목은 메시지를 인쇄하고 나머지는 종료됩니다. 내가 여기서 무엇을 놓치고 있는 걸까요?
답변1
flock
매뉴얼 페이지의 예를 기반으로 다음 예를 고려하십시오.
#!/bin/bash
func() {
echo "$$ trying to acquire lock"
(
flock -e 42
echo "lock acquired by $$"
sleep 10
) 42> /tmp/mylock
echo "lock released by $$"
}
func
이제 스크립트를 한 번 실행하면 다음과 같습니다.
$ bash ex.sh
22241 trying to acquire lock
lock acquired by 22241
lock released by 22241
10초 절전 창(백그라운드의 첫 번째 인스턴스) 내에서 이 스크립트의 두 인스턴스를 실행하는 경우 가능한 이벤트 순서는 다음과 같습니다.
$ bash ex.sh& bash ex.sh
[1] 24518
24519 trying to acquire lock
24518 trying to acquire lock
lock acquired by 24519
lock released by 24519
lock acquired by 24518
$
lock released by 24518
이 예에서는 두 번째 프로세스가 경쟁에서 승리하고 먼저 잠금을 획득합니다. 그런 다음 잠금을 해제하고 첫 번째(백그라운드) 프로세스가 잠금을 획득하도록 허용한 다음 잠금을 해제합니다.
첫 번째 프로세스가 경주에서 승리할 가능성을 높이기 위해 시작 사이에 지연을 도입할 수 있습니다.
$ bash ex.sh& sleep 1; bash ex.sh
[1] 30158
30158 trying to acquire lock
lock acquired by 30158
30179 trying to acquire lock
lock released by 30158
lock acquired by 30179
lock released by 30179