web-dev-qa-db-fra.com

Comment empêcher deux scripts Shell de s'exécuter simultanément?

J'ai un script de sauvegarde tar qui s'exécute une fois par mois. Il passe la nuit à travers cron. J'ai également un programme d'alimentation qui redémarre le serveur à 4.15 heures tous les soirs.

Le problème est que le serveur redémarre lorsque le script tar est en cours d'exécution.

Puis-je ajouter quelque chose au début et à la fin d'un script bash pour désactiver un redémarrage alors que le script est actif?

2
Magnus

Il y a une discussion sur la façon d'implémenter un verrou mutex dans la FAQ Bash ici:

http://mywiki.wooledge.org/BashFAQ/045

Vous pouvez implémenter quelque chose de similaire, mais faites votre boucle de script de redémarrage jusqu'à ce que le verrou soit libre. Je n'ai pas testé ce qui suit, mais voici un point de départ:

Script Tar:

#!/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 redémarrage:

#!/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
3
David Edwards

J'utiliserais la technique d'interrogation pour le pid de ce script. L'idée de base est d'attendre que le script publie le PID (c'est-à-dire qu'il s'est terminé), puis seulement à l'étape suivante du script de redémarrage. Et bien sûr, si aucun processus n'est en cours d'exécution, le script se réinitialisera.

#!/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
0