Quiero tener un archivo que se use como contador. El usuario A escribirá e incrementará este número, mientras que el usuario B solicita leer el archivo. ¿Es posible que el usuario A pueda bloquear este archivo para que nadie pueda leerlo o escribirlo hasta que finalice la escritura del usuario A?
Lo he investigado flock
pero parece que no puedo hacerlo funcionar como lo espero.
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt && sleep 5
¡Si hay una manera más apropiada de obtener este archivo incremental de tipo atómico, sería genial escucharlo también!
Mi meta es:
LOCK counter.txt; write to counter.txt;
mientras que al mismo tiempo
Read counter.txt; realize it's locked so wait until that lock is finished.
shell
shell-script
lock
d -_- b
fuente
fuente
&& sleep 5
se ejecuta después de que el lote libera el bloqueo.)flock
, pero lo pondré como una pregunta separada. Gracias John!Respuestas:
El procesamiento de Bash del comando a continuación puede ser sorprendente:
Bash primero se ejecuta
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt
y, si eso se completa con éxito (liberando el bloqueo), entonces se ejecutasleep 5
. Por lo tanto, el bloqueo no se mantiene durante los 5 segundos que uno puede esperar.Aparte de
&
versus&&
Si uno tiene dos comandos,
A
yB
, entonces:A & B
comienzaA
en segundo plano y luego comienzaB
sin esperar aA
que termine.A && B
comienzaA
, espera a que se complete y luego, si se completa con éxito (código de salida 0), comienzaB
. SiA
falla (código de salida distinto de cero),B
nunca se ejecuta.En suma,
&
y&&
son dos operadores de listas completamente diferentes.fuente
A && B
,A
esperaría aB
que termine.Los bloqueos de archivos no son obligatorios 1 , es decir, no puede bloquear un archivo para que otro proceso no pueda acceder a él. Bloquear un archivo significa que si un proceso (otro) verifica si se ha bloqueado, lo sabrá.
El propósito de
flock
es hacer cosas como lo que quieres, pero luego debes usarlasflock
para cada intento de acceso . Tenga en cuenta que esas son llamadas de bloqueo; deman flock
:1. Lo que hace que la función parezca inútil si la está utilizando, por ejemplo, para seguridad, pero ese no es el propósito de los bloqueos de archivos: son para la sincronización, que es lo que está haciendo. El usuario Leo señaló que puede haber una implementación no estandarizada de bloqueo obligatorio de archivos en el kernel de Linux ( vea esta discusión ), en base a paralelos históricos de otros sistemas operativos * nix. Sin embargo, esto parece ser solo una interfaz de nivel C.
fuente
flock
cada vez. ¡muy útil!Puede usar "sh -c command ..." para ejecutar todo el comando de shell, incluida la redirección de archivos, con el bloqueo retenido. Además, debido a que está utilizando el archivo como contador, debe mantener el bloqueo continuamente mientras lee y reescribe. Por lo tanto, querrá hacer algo como esto para incrementar el contador y devolver su nuevo valor:
Cambiar los signos más a signos menos debería disminuir el contador:
Espero que inicialice el contador antes de que ocurra cualquier disputa, por lo que no debería tener que preocuparse por bloquear tan temprano:
No creo que alguna vez necesites cambiar el valor del contador mientras podría ocurrir una disputa, pero, si alguna vez lo hiciste, deberías hacerlo así:
Creo que entiendes cómo hacer la lectura, pero lo incluyo para completar:
fuente