Apparentemente flock -o FD
non risolve il problema. Un trucco per liberarsi del superfluo FD per i comandi successivi nello stesso script sia per avvolgere la parte rimanente in una sezione che chiude la FD, in questo modo:
var=outside
exec 9>>lockfile
flock -n 9 || exit
{
: commands which do not see FD9
var=exported
# exit would exit script
# see CLUMSY below outside this code snippet
} 9<&-
# $var is "exported"
# drop lock closing the FD
exec 9<&-
: remaining commands without lock
Questo è un po CLUMSY
, perché la stretta della FD è così lontana dalla serratura.
È possibile refactoring questo perdere la "naturale" flusso di comando, ma mantenere le cose insieme, che vanno di pari passo:
functions_running_with_lock()
{
: commands which do not see FD9
var=exported
# exit would exit script
}
var=outside
exec 9>>lockfile
flock -n 9 || exit
functions_running_with_lock 9<&-
# $var is "exported"
# drop lock closing the FD
exec 9<&-
: remaining commands without lock
Un po 'di scrittura più bello che mantiene il flusso di comando naturali a scapito di un altro bivio più un ulteriore processo e un flusso di lavoro leggermente diverso, che spesso è utile. Ma questo non permette di impostare le variabili nel guscio esterno:
var=outside
exec 9>>lockfile
flock -n 9 || exit
(
exec 9<&-
: commands which do not see FD9
var=exported
# exit does not interrupt the whole script
exit
var=neverreached
)
# optionally test the ret if the parentheses using $?
# $var is "outside" again
# drop lock closing the FD
exec 9<&-
: remaining commands without lock
A proposito, se si vuole veramente essere sicuri che bash
non introduce descrittori di file aggiuntivi (a "nascondere" la FD chiuso e saltare un vera forchetta), ad esempio se esegui dei demoni che poi terrebbero il blocco per sempre, quest'ultima è raccomandata, solo per essere sicuri. lsof -nP
e strace your_script
sono i tuoi amici.
Thx! Esattamente quello che stavo cercando. – user1050755
Non funziona con 'flock 9', questo è solo per il caso' flock -o lockfile [args ..] ' – Tino