Como posso evitar que dois scripts de shell sejam executados ao mesmo tempo?

2

Eu tenho um script de backup tar que é executado uma vez por mês. Ele é executado à noite através de cron . Eu também tenho uma programação de energia que reinicia o servidor em 4,15 todas as noites.

O problema é que o servidor é reinicializado enquanto o script tar está em execução.

Posso adicionar algo ao começo e ao final de um script bash para desativar uma reinicialização enquanto o script está ativo?

    
por Magnus 29.05.2012 / 12:30

2 respostas

3

Há uma discussão sobre como implementar um bloqueio mutex nas FAQs do Bash aqui:

link

Você pode implementar algo semelhante, mas faça o loop de script de reinicialização até que o bloqueio esteja livre. Eu não testei o seguinte, mas aqui está um ponto de partida:

Roteiro de alcatrão:

#!/bin/bash

lockdir=/tmp/myscript.lock

if mkdir "$lockdir"
then    # directory did not exist, but was created successfully
    echo >&2 "successfully acquired lock: $lockdir"
    trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
    # continue script
else
    echo >&2 "cannot acquire lock, giving up on $lockdir"
    exit 0
fi

# DO YOUR ORIGINAL TAR SCRIPT HERE

Script de reinicialização:

#!/bin/bash

lockdir=/tmp/myscript.lock

while true; do
    if mkdir "$lockdir"
    then    # directory did not exist, but was created successfully
        trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
        break    # continue with script
    else
        sleep 5  # sleep for 5 seconds and try again
    fi
done

# RUN YOUR REBOOT COMMANDS HERE
    
por David Edwards 29.05.2012 / 12:50
0

Eu usaria a técnica de pesquisa para o pid desse script. A ideia básica é aguardar até que o script libere o PID (o que significa que ele tenha saído) e só então vá para a próxima etapa no script de reinicialização. E, claro, se nenhum processo estiver em execução, o script será reiniciado.

#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do 
  sleep 0.25  # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
    
por Sergiy Kolodyazhnyy 06.04.2016 / 17:13