9
votes

Prévenir la propagation de la serrure

Un moyen simple et apparemment fiable de faire le verrouillage sous Bash est le suivant: XXX

Cependant, Bash propage notorement une telle serrure FD à toutes les trucs forcés, y compris des programmes exécutés, etc. < 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.

Je sais que je peux faire des choses comme: xxx

Mais c'est assez fastidieux.

Y a-t-il une meilleure solution?


0 commentaires

4 Réponses :


1
votes

Il n'y a aucun moyen de marquer une FD comme proximité sur Bash, donc non, il n'y a pas de meilleure solution.


0 commentaires

9
votes

Vous pouvez utiliser l'option -o de ligne de commande sur flock (1) (option longue - Fermer , 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) : xxx


2 commentaires

THX! Exactement ce que je cherchais.


Ne fonctionne pas avec flock 9 , ceci est uniquement pour la commande flock -o verrouillage [args ..] case



1
votes

-o ne fonctionne pas avec des descripteurs de fichier, cela ne fonctionne que avec des fichiers. Vous devez utiliser -u pour déverrouiller le descripteur de fichier.

Ce que je fais est ceci: xxx

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.


0 commentaires

4
votes

apparemment 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: xxx pré>

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>

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


0 commentaires