mutex e semáforo como no shell script

1

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

core.sh

Agora existe uma maneira de esperar pela exclusão de /tmp/proc[?][*].signature.mutex todos esses arquivos usando o loop ou algo assim e depois continuar a execução adicional

Como alcançar o objetivo do core.sh

    
por user2642486 30.10.2017 / 15:33

1 resposta

2

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.

    
por 30.10.2017 / 17:02