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
____________________________________________