flock - Gerencia bloqueios de scripts de shell
man flock
por exemplo
flock -x lockfile -c comando
Então eu tenho um bash scripts que faz algumas coisas (pull do github, delete folders .. etc ..) coisas bem básicas. Eu geralmente o executo sempre que preciso de uma nova versão do aplicativo da Web no servidor.
O problema é que não há nada que impeça esse script de ser executado simultaneamente por pessoas diferentes (quase todos os desenvolvedores se conectam a esse servidor e executam o mesmo comando).
Até agora, não aconteceu que o script seja executado por mais de um desenvolvedor por vez.
Como posso ter certeza de que esse script não pode ser executado se já estiver sendo executado por outro usuário? Bloqueio de pasta ou verificação se o script está sendo executado por outro usuário (isso é factível?) Outra coisa?
Todos os usuários que podem executar este script são sudoers.
EDIT: Bem, depois de verificar meus colegas, verifica-se que nem todos eles estão usando o script .. alguns deles estão executando os comandos manualmente, então eu preciso bloquear a pasta em si.
Colocar essa linha dentro do script também funciona. (Desculpe, esqueci que defini o mutex como uma função).
mutex() {
if ( set -o noclobber; echo "$$" > "$1") 2> /dev/null; then
trap "rm -f \"$1\"; exit \$?" INT TERM EXIT KILL
return 0
else
return 1
fi
}
mutex .LOCKFILE || { echo "Another instance of $0 still exists"; exit 1; }
Usar um diretório de bloqueio é uma boa operação atômica:
lockdir="/tmp/lock.$(basename "$0")"
if ! mkdir "$lockdir" >&/dev/null; then
echo "lock directory already exists" >&2
exit 1
fi
...
# remember to clean up. Use 'trap' for robustness
rmdir "$lockdir"
Você pode adicionar algum código precursor que verifique se uma instância do seu script está sendo executada. A verificação é baseada na sua execução
ps ax | grep bash | grep hello.sh
Nesse caso, alguém está executando seu script "hello.sh" e o ID do processo é 78775:
78775 s003 R+ 0:02.40 bash ./hello.sh
Se ninguém estiver executando seu script, a linha de saída retornada ficará em branco.
Seu código precursor deve ser capaz de identificar a saída em branco quando você executar o comando ps e impedir que o script seja executado, seja por meio de interrupção ou por meio de um conjunto ou atraso aleatório - sua escolha.
Em resumo, você está executando a carne do seu script como um singleton.
Tags bash-script