¿Alguien puede explicar cómo usar la bandada y los descriptores de archivo para bloquear un archivo y escribir en el archivo bloqueado?

14

Desnudo conmigo, ya que soy nuevo en la flockherramienta y no he usado descriptores de archivos hasta donde sé.

Tengo un script bash que hace una solicitud cURL y escribe la salida en un archivo llamado resp.txt. Necesito crear un bloqueo exclusivo para poder escribir en ese archivo y no preocuparme de que varios usuarios ejecuten el script y editen el archivo de texto al mismo tiempo.

Aquí está el código que espero bloquear el archivo, realizar la solicitud y escribir en el archivo de texto:

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

¿Es esta la forma correcta de hacerlo? Mi script real es un poco más largo que esto, pero parece que se rompe cuando agrego la flocksintaxis al script bash.

Si alguien pudiera explicar cómo funcionan estos descriptores de archivos y hacerme saber si estoy bloqueando el archivo correctamente, ¡sería increíble!

PatoPuncher
fuente

Respuestas:

8

Esto no es correcto porque cuando lo hace ( flock -e 200; ... ) 200> file, está truncando el archivo file antes de obtener el bloqueo exclusivo. Creo que deberías hacer:

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

para colocar el bloqueo en el archivo abierto como solo lectura.

Nota. Algunos shells no admiten descriptores de archivo mayores que 9. Además, el descriptor de archivo codificado ya puede estar utilizado. Con shells avanzados (bash, ksh93, zsh), se puede hacer lo siguiente:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)
vinc17
fuente
Sin embargo, necesito que el comando curl escriba en el archivo. ¿Estoy malentendido cómo flockfunciona? Soy nuevo en los descriptores de archivos: /
DuckPuncher
1
@DuckPuncher El mecanismo de bloqueo es independiente de las operaciones de lectura / escritura que puede realizar en el archivo. Entonces, curltodavía puedo escribir en el archivo. Tenga en cuenta que esto puede ser inseguro (o incluso puede no funcionar) con NFS, pero no use un script de shell para el bloqueo de archivos a través de NFS. Con bash, también puede abrir el archivo para leer y escribir: 200<> resp.txtpero esto no debería cambiar nada.
vinc17