Je veux avoir un fichier utilisé comme compteur. L'utilisateur A écrit et incrémente ce nombre, tandis que l'utilisateur B demande de lire le fichier. Est-il possible que l'utilisateur A puisse verrouiller ce fichier afin que personne ne puisse y lire ou y écrire tant que l'écriture de l'utilisateur A n'est pas terminée?
J'ai regardé flock
mais je n'arrive pas à le faire fonctionner comme je m'y attendais.
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt && sleep 5
S'il existe un moyen plus approprié d'obtenir ce fichier d'incrémentation de type atomique, ce serait génial d'entendre aussi!
Mon but est:
LOCK counter.txt; write to counter.txt;
pendant ce temps-là
Read counter.txt; realize it's locked so wait until that lock is finished.
shell
shell-script
lock
d -_- b
la source
la source
&& sleep 5
est exécuté après que le troupeau aflock
, mais je vais poser cela comme une question distincte. Merci John!Réponses:
Le traitement par Bash de la commande ci-dessous peut être surprenant:
Bash s'exécute d'abord
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt
et, si cela se termine avec succès (libération du verrou), il s'exécutesleep 5
. Ainsi, le verrou n'est pas maintenu pendant les 5 secondes que l'on peut attendre.Mis à part
&
contre&&
Si l'on a deux commandes,
A
etB
alors:A & B
démarreA
en arrière-plan puis démarreB
sans attendre laA
fin.A && B
démarreA
, attend qu'il se termine, puis, s'il se termine avec succès (code de sortie 0), démarreB
. SiA
échoue (code de sortie différent de zéro), ilB
n'est jamais exécuté.En somme,
&
et ce&&
sont deux opérateurs de liste complètement différents.la source
A && B
,A
attendraitB
à la fin.Les verrous de fichiers ne sont pas obligatoires 1 - c'est-à-dire que vous ne pouvez pas verrouiller un fichier de sorte qu'un autre processus ne puisse pas y accéder. Le verrouillage d'un fichier signifie que si un (autre) processus vérifie s'il a été verrouillé, il le saura.
Le but de
flock
est de faire des choses comme ce que vous voulez, mais vous devez ensuite les utiliserflock
pour chaque tentative d'accès . Gardez à l'esprit que ces appels bloquent; deman flock
:1. Ce qui rend la fonctionnalité inutile si vous l'utilisez pour, par exemple, la sécurité, mais ce n'est pas le but des verrous de fichiers - ils sont pour la synchronisation, c'est ce que vous faites. L'utilisateur Leo a souligné qu'il peut y avoir une implémentation non standardisée du verrouillage de fichiers obligatoire dans le noyau Linux ( voir cette discussion ), basée sur des parallèles historiques d'autres systèmes d'exploitation * nix. Cependant, cela semble être une interface de niveau C uniquement.
la source
flock
chaque fois. très utile!Vous pouvez utiliser "commande sh -c ..." pour exécuter la commande shell entière, y compris la redirection de fichiers, avec le verrou maintenu. De plus, comme vous utilisez le fichier comme compteur, vous devez maintenir le verrou en continu pendant que vous effectuez la lecture et la réécriture. Donc, vous voudriez faire quelque chose comme ça pour incrémenter le compteur et retourner sa nouvelle valeur:
Changer les signes plus en signes moins devrait décrémenter le compteur:
Je m'attends à ce que vous initialisiez le compteur avant que tout conflit ne se produise, il ne devrait donc pas être nécessaire de vous soucier du verrouillage aussi tôt:
Je ne pense pas que vous auriez jamais besoin d'altérer la valeur du compteur alors que des conflits pourraient se produire, mais, si vous l'avez déjà fait, vous devriez le faire de la manière suivante:
Je pense que vous comprenez comment faire la lecture, mais je l'inclus pour être complet:
la source