Como posso ter certeza de que um script é executado exclusivamente? [duplicado]

3

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.

    
por Ali 11.03.2014 / 13:49

4 respostas

5

flock - Gerencia bloqueios de scripts de shell

man flock

por exemplo

flock -x lockfile -c comando

    
por 11.03.2014 / 13:55
2

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; }
    
por 11.03.2014 / 14:17
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"
    
por 11.03.2014 / 14:50
0

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.

    
por 11.03.2014 / 17:17