proc1.sh

proc1.sh

proc1.sh

#!/bin/sh
touch /tmp/proc1.signature.mutex
#do something for long time
sleep 100 
rm -rf /tmp/proc1.signature.mutex

proc2.sh

#!/bin/sh
touch /tmp/proc2.signature.mutex
#do something for long time
sleep 100 
rm -rf /tmp/proc2.signature.mutex

proc3.sh

#!/bin/sh
touch /tmp/proc3.signature.mutex
#do something for long time
sleep 100 
rm -rf /tmp/proc3.signature.mutex

코어 파일

이제 루프나 다른 수단을 사용하여 /tmp/proc[?][*].signature.mutex에 있는 모든 파일이 삭제될 때까지 기다린 다음 추가로 진행할 수 있는 방법이 있습니까?

core.sh의 목표를 달성하는 방법

답변1

뮤텍스는 상호 배제 잠금의 한 유형입니다. 스크립트 procN.sh는 뮤텍스를 "잠그기" 전에 다른 프로세스에서 보유하고 있는지 여부를 테스트하지 않습니다.

다른 스크립트를 시작 하면 core.sh해당 스크립트가 완료될 때까지 기다리는 것이 쉽습니다.

#!/bin/sh

./proc1.sh &
./proc2.sh &
./proc3.sh &

wait

# other processing

이렇게 하면 파일을 잠글 필요가 완전히 제거됩니다. 그게 불가능하다면 고려해 보세요

#!/bin/sh

while [ -e "$HOME/locks/proc1.signature.mutex" ] ||
      [ -e "$HOME/locks/proc2.signature.mutex" ] ||
      [ -e "$HOME/locks/proc3.signature.mutex" ]
then
    echo 'waiting...'
    sleep 10
done

# other processing

부자연스러운 원인으로 인해 스크립트가 종료되고 파일이 남겨지는 것을 방지하려면 procN.sh트랩을 사용하십시오.

#!/bin/sh

lockfile="$HOME/locks/proc1.signature.mutex"

while [ -e "$lockfile" ]; do
    echo 'Can not get lock. Waiting...' >&2
    sleep 10
done
## alternatively:
# [ -e "$lockfile" ] && { echo 'something is wrong' >&2; exit 1; }

trap 'rm "$lockfile"; exit' EXIT INT TERM HUP
touch "$lockfile"

# etc.
# no need to rm the lock file at the end

-e "$lockfile"touch테스트와 테스트 사이에는 다른 프로세스가 동일한 파일에 대해 잠금을 설정할 수 있는 공간이 있습니다 .

이를 방지하려면 자물쇠를 사용하세요.목차대신에:

#!/bin/sh

lockdir="$HOME/locks/proc1.signature.mutex"

while ! mkdir "$lockdir"; do
    echo 'Can not get lock. Waiting...' >&2
    sleep 10
done

trap 'rmdir "$lockdir"; exit' EXIT INT TERM HUP

# etc.
# no need to rmdir the lock dir at the end

비슷한 방식으로 심볼릭 링크를 사용할 수도 있습니다.

$HOME잠금 파일/디렉토리에는 아래 경로를 사용했습니다 . 를 사용하면 /tmp모든 사용자가 올바른 파일/디렉토리를 생성하여 스크립트 실행을 잠글 수 있습니다.

답변2

나는 썼다https://github.com/acbits/sema이런 이유입니다. 오랫동안 SE에 관심을 두지 않다가 이런 문제를 발견했습니다. Linux에서만 테스트했습니다.

답변3

사용https://github.com/acbits/sema쉘 스크립트에서 세마포어를 사용하십시오.

 A.sh 
_____________________________________________
#!/bin/sh

echo A.sh started
sema -c S1
./B.sh &
echo A.sh more work
echo waiting for B.sh to finish
sema -w S1
echo B.sh finished execution
echo A.sh do more work
# cleanup semaphores
sema -d S1
_____________________________________________

B.sh
_____________________________________________
#!/bin/sh

echo Hello from B.sh
sleep 5
sema -r S1
echo Bye bye from B.sh
____________________________________________

관련 정보