Um mutex é um bloqueio exclusivo mútuo. Seus scripts procN.sh
nunca testam se o mutex é mantido por outro processo antes de "bloquear".
Se você deixar core.sh
iniciar os outros scripts, será fácil esperar pela conclusão deles:
#!/bin/sh
./proc1.sh &
./proc2.sh &
./proc3.sh &
wait
# other processing
Isso elimina a necessidade dos arquivos de bloqueio. Se isso não for possível, considere
#!/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
Para evitar deixar arquivos pelos scripts procN.sh
se eles morrerem de causas não naturais, use uma armadilha:
#!/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
Observe que há um espaço entre o -e "$lockfile"
test e o touch
no qual outro processo pode bloquear o mesmo arquivo.
Para evitar isso, use um diretório de bloqueio :
#!/bin/sh
lockdir="$HOME/locks/proc1.signature.mutex"
while ! mkdir "$lockdir"; do
echo 'Can not get lock. Waiting...' >&2
sleep 10
done
## alternatively:
# [ -e "$lockdir" ] && { echo 'something is wrong' >&2; exit 1; }
trap 'rmdir "$lockdir"; exit' EXIT INT TERM HUP
# etc.
# no need to rmdir the lock dir at the end
Você também pode usar um link simbólico de maneira semelhante.
Observe que usei um caminho em $HOME
para os arquivos / diretórios de bloqueio. Se estiver usando /tmp
, qualquer usuário poderá bloquear seu script, simplesmente criando o arquivo / diretório correto.