¿La redirección de la salida a un archivo aplica un bloqueo al archivo?

¿La redirección de la salida a un archivo aplica un bloqueo al archivo?

Si tengo un comando

$ ./script >> file.log

que se llama dos veces, y la segunda llamada ocurre antes de que finalice la primera, ¿qué sucede?

¿La primera llamada obtiene un bloqueo exclusivo en el archivo de salida? Si es así, ¿el segundo script falla al intentar escribir o el shell acepta el resultado (permitiendo que el script finalice) y arroja un error?

¿O el archivo de registro se escribe dos veces?

Respuesta1

Los sistemas Unix en general evitan los bloqueos obligatorios. Hay algunos casos en los que el kernel bloqueará un archivo contra modificaciones realizadas por programas de usuario, pero no si simplemente está siendo escrito por otro programa. Ningún sistema Unix bloqueará un archivo porque un programa esté escribiendo en él.

Si desea que las instancias simultáneas de su secuencia de comandos no se pisen entre sí, debe utilizar un mecanismo de bloqueo explícito comoflock lockfile.

Cuando abre un archivo para agregarlo, lo cual >>es así, se garantiza que cada programa escribirá siempre hasta el final del archivo. Por lo tanto, la salida de varias instancias nunca se sobrescribirá entre sí y, si se turnan para escribir, su salida estará en el mismo orden que las escrituras.

Lo malo que podría pasar es que una de las instancias escriba varios fragmentos de resultados y espere que salgan juntos. Entre escrituras consecutivas de una instancia, otras instancias pueden realizar sus propias escrituras. Por ejemplo, si la instancia 1 escribe foo, luego la instancia 2 escribe helloy solo entonces la instancia 2 escribe bar, entonces el archivo contendrá foohellobar.

Un proceso escribe efectivamente en el archivo cuando llama a la writellamada del sistema. Una llamada a writees atómica: cada llamada a writeescribe una secuencia de bytes que no será interrumpida por otros programas. A menudo hay un límite en la cantidad de datos que se writeescribirá efectivamente con una sola llamada: para tamaños más grandes, solo se escribe el comienzo de los datos y la aplicación debe writevolver a llamar. Además, muchos programas realizanalmacenamiento en búfer: acumulan datos en un área de memoria y luego escriben estos datos en un solo fragmento. Algunos programas vacían el búfer de salida después de una línea completa u otra separación significativa. Con este tipo de programas, puedes esperar que líneas enteras sean ininterrumpidas, siempre y cuando no sean demasiado largas (hasta unos pocos kilobytes; esto depende del sistema operativo). Si el programa no se descarga en puntos significativos, sino que solo se basa en el tamaño del búfer, es posible que vea algo como 4 kB de una instancia, luego 4 kB de otra instancia, luego nuevamente 4 kB de la primera instancia y así sucesivamente.

Respuesta2

Como estás usando >>, lo que significa agregar, cada línea de salida de cada instancia se agregará en el orden en que ocurrió.

Si la salida de su script se imprime 1\ncon 5\nun retraso de un segundo entre cada uno y la instancia dos se inicia 2,5 segundos después, obtendrá esto:

1
2
1
3
2
4
3
5
4
5

Así que para responder a su pregunta, no.

información relacionada