¿Flock & exec es seguro en bash?

13

El fragmento de bloqueo "estándar" que he visto se parece a ...

(
    flock -n 200 || exit 1;
    # do stuff
) 200>program.lock

¿Es seguro (las pruebas parecen decirlo) para usar execen ese punto? ¿El subproceso retendrá la cerradura?

(
    flock -n 200 || exit 1;
    exec /usr/bin/python vendors-notcoolstuff.py
) 200>program.lock

Recuerdo vagamente que los procesos ejecutados conservan los descriptores de archivos abiertos y, dado que flock usa descriptores de archivos, debería funcionar. Pero no puedo encontrar ninguna documentación que lo haga definitivo y claro.

Para el registro, esto es específico de Linux.

Danny
fuente

Respuestas:

3

Sí, las cerraduras se conservan en todo exec. Los bloqueos se conservan en la llamada del sistema subyacente execve, siempre que el descriptor de archivo permanezca abierto. Los descriptores de archivo permanecen abiertos a execvemenos que se hayan configurado para cerrarse en exec, y los descriptores de archivo creados por la redirección de shell no están marcados como close-on-exec.

Gilles 'SO- deja de ser malvado'
fuente
6

Sí lo es. Exec simplemente reemplaza la imagen del proceso, pero sigue siendo el mismo proceso, por lo que los bloqueos de nivel del sistema operativo asociados con él siguen siendo los mismos.

Es muy fácil verificar que funciona:

bloquear

(
    flock -n 200 || exit 1;
    echo "locked"
    exec ./script
) 200>program.lock

guión

sleep 100

Intenta correr ./lockdos veces en los próximos 100 segundos. Solo obtendrá el bloqueo una vez, ergo execno libera el bloqueo.

PSkocik
fuente