Flock & exec è sicuro in bash?


13

Lo snippet di blocco "standard" che ho visto è simile a ...

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

È sicuro (il test sembra dirlo) da usare execa quel punto? Il sottoprocesso manterrà il blocco?

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

Ricordo vagamente che i processi exec'd mantengono descrittori di file aperti e poiché flock usa descrittori di file dovrebbe funzionare. Ma non riesco a trovare alcuna documentazione che lo renda definitivo e chiaro.

Per la cronaca, questo è specifico per Linux.

Risposte:


3

Sì, i blocchi sono conservati exec. I blocchi vengono mantenuti attraverso la chiamata di sistema sottostante execve, purché il descrittore di file rimanga aperto. I descrittori di file rimangono aperti a execvemeno che non siano stati configurati per essere chiusi su exec e i descrittori di file creati dal reindirizzamento della shell non sono contrassegnati come close-on-exec.


6

Sì. Exec sostituisce semplicemente l'immagine di processo, ma è sempre lo stesso processo, quindi i blocchi a livello di sistema operativo associati rimangono invariati.

È molto facile verificare che funzioni:

serratura

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

copione

sleep 100

Prova a correre ./lockdue volte entro i successivi 100 secondi. Riceverai il blocco solo una volta, ergo execnon rilascia il blocco.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.