2017-09-10 1 views
1

Je voudrais éviter que d'autres terminaux d'exécuter un certain script chaque fois qu'un autre terminal est en cours d'exécution, il cependant en bash, mais je ne suis pas tout à fait sûr de la façon dont je serais en mesure de va de l'avant en le faisant. Toute aide ou conseil pourrait être grandement apprécié!Empêcher les autres terminaux de l'exécution d'un script, tandis qu'un autre terminal utilise ce

Dans l'exemple: Lorsque ce script est exécuté sur un autre terminal, tous les autres terminaux ne peuvent pas exécuter ce script. Et afficher un message "SOUS MAINTENANCE".

Répondre

1

Vous pouvez utiliser le concept d'un "lockfile." Par exemple:

if [ -f ~/.mylock ]; then 
    echo "UNDER MAINTENANCE" 
    exit 1 
fi 
touch ~/.mylock 

# ... the rest of your code 

rm ~/.mylock 

Pour obtenir colombophile/sûr, vous pouvez « piège » le signal EXIT pour le supprimer automatiquement à la fin:

trap 'rm ~/.mylock' EXIT 
+1

C'est la condition de course parfaite – hek2mgl

2

Pour éviter les conditions de course, vous pouvez utiliser flock(1) avec un fichier de verrouillage . Il y a one flock(1) implementation qui prétend travailler sur Linux, BSD et OS X. Je n'ai pas vu un explicitement pour Unix.
Il y a une discussion intéressante here.

MISE À JOUR:
J'ai trouvé un moyen très intelligent de L. Schwartz Randal here. J'aime vraiment celle-ci. Il s'appuie sur flock(1) et bash, et il utilise le script lui-même comme son propre fichier de verrouillage. Check this out:

/usr/local/bin/onlyOne est un script pour obtenir le verrou

#!/bin/bash 
exec 200< $0 
if ! flock -n 200; then 
    echo "there can be only one" 
    exit 1 
fi 

Ensuite myscript utilise onlyOne pour obtenir le verrou (ou non):

#!/bin/bash 
source /usr/local/bin/onlyOne 
# The real work goes here. 
echo "${BASHPID} working" 
sleep 120 
+0

je suis parti dans les références _Highlander_. Il semblait légèrement sacrilège de les enlever. –

1

Utilisez flock et mettre cela sur le dessus de votre script:

if ! flock -xn /path/to/lockfile ; then 
    echo "script is already running." 
    echo "Aborting." 
    exit 1 
fi 

Remarque: path/to/lockfile pourrait être le chemin d'accès à votre script. Cela éviterait de créer un fichier supplémentaire.