Un moyen simple et apparemment fiable de faire le verrouillage sous Bash est le suivant: Cependant, Bash propage notorement une telle serrure FD à toutes les trucs forcés, y compris des programmes exécutés, etc. P> < P> Y a-t-il un moyen de dire à Bash de ne pas dupliquer la FD? C'est génial que la serrure soit attachée à une FD qui soit supprimée lorsque le programme se termine, peu importe la fin de la résiliation. P> Je sais que je peux faire des choses comme: p> Mais c'est assez fastidieux. P> Y a-t-il une meilleure solution? P> P>
4 Réponses :
Il n'y a aucun moyen de marquer une FD comme proximité sur Bash, donc non, il n'y a pas de meilleure solution. P>
Vous pouvez utiliser l'option -o code> de ligne de commande sur
flock (1) code> (option longue
- Fermer code>, ce qui pourrait être meilleur pour Écrire dans des scripts pour la nature auto-documentante) Pour préciser que le descripteur de fichier doit être fermé avant d'exécuter des commandes via
flock (1) code>:
THX! Exactement ce que je cherchais.
Ne fonctionne pas avec flock 9 code>, ceci est uniquement pour la commande
flock -o verrouillage [args ..] code> case
Ce que je fais est ceci: p> De cette façon, le descripteur de fichier sera fermé par le processus qui a fait la serrure et, étant donné que tous les autres processus quitteront, cela signifie que seul le processus de maintien de la serrure déverrouille le descripteur de fichier et retirez le fichier de verrouillage. P> P> -o code> ne fonctionne pas avec des descripteurs de fichier, cela ne fonctionne que avec des fichiers. Vous devez utiliser
-u code> pour déverrouiller le descripteur de fichier.
apparemment ceci est un peu maladroit code>, car la fermeture de la FD est jusqu'à présent séparée de la serrure. p> Vous pouvez reflacteur Ceci perdant le flux de commande "naturel", mais aussi les choses qui appartiennent ensemble: p> flock -o fd code> ne résout pas le problème. Un astuce pour se débarrasser de la FD superflue pour les commandes ultérieures dans le même script Shell consiste à envelopper la pièce restante dans une section qui ferme la FD, comme ceci:
var=outside
exec 9>>lockfile
flock -n 9 || exit
(
exec 9<&-
: commands which do not see FD9
var=exported
# exit does not interrupt the whole script
exit
var=neverreached
)
# optionally test the ret if the parentheses using $?
# $var is "outside" again
# drop lock closing the FD
exec 9<&-
: remaining commands without lock