Quelqu'un peut-il expliquer comment utiliser les descripteurs de troupeau et de fichier pour verrouiller un fichier et écrire dans le fichier verrouillé?

14

Soyez nu avec moi car je suis nouveau dans l' flockoutil et je n'ai pas utilisé de descripteurs de fichiers pour autant que je sache.

J'ai un script bash qui fait une demande cURL et écrit la sortie dans un fichier appelé resp.txt. J'ai besoin de créer un verrou exclusif afin de pouvoir écrire dans ce fichier et ne pas m'inquiéter du fait que plusieurs utilisateurs exécutent le script et modifient le fichier texte en même temps.

Voici le code que je m'attends à verrouiller le fichier, effectuer la demande et écrire dans le fichier texte:

(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt

Est-ce la bonne façon de procéder? Mon script réel est un peu plus long que cela, mais il semble se casser lorsque j'ajoute la flocksyntaxe au script bash.

Si quelqu'un pouvait expliquer comment ces descripteurs de fichiers fonctionnent et faites-moi savoir si je verrouille correctement le fichier, ce serait génial!

DuckPuncher
la source

Réponses:

8

Ce n'est pas correct car lorsque vous le faites ( flock -e 200; ... ) 200> file, vous tronquez le fichier file avant d'obtenir le verrou exclusif. Je pense que tu devrais faire:

touch resp.txt
(
  flock -e 200
  curl 'someurl' -H 'someHeader' > resp.txt
) 200< resp.txt

pour placer le verrou sur le fichier ouvert en lecture seule.

Remarque. Certains shells ne prennent pas en charge les descripteurs de fichiers supérieurs à 9. De plus, le descripteur de fichier codé en dur peut déjà être utilisé. Avec les shells avancés (bash, ksh93, zsh), les opérations suivantes peuvent être effectuées:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)
vinc17
la source
J'ai besoin que la commande curl écrive dans le fichier. Suis-je incompréhensible sur le flockfonctionnement? Je suis nouveau dans les descripteurs de fichiers: /
DuckPuncher
1
@DuckPuncher Le mécanisme de verrouillage est distinct des opérations de lecture / écriture que vous pouvez effectuer sur le fichier. Donc, curlpeut toujours écrire dans le fichier. Notez que cela peut être dangereux (ou même ne pas fonctionner) avec NFS, mais n'utilisez pas de script shell pour le verrouillage de fichiers sur NFS. Avec bash, vous pouvez également ouvrir le fichier en lecture et en écriture: 200<> resp.txtmais cela ne devrait rien changer.
vinc17