По-видимому flock -o FD
не исправить проблему. Трюк, чтобы избавиться от лишнего FD для последующих команд в одном сценарии оболочки, чтобы обернуть оставшуюся часть в секцию, которая закрывает ФО, как это:
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
Это немного CLUMSY
, потому что близко FD до сих пор отделены от замка.
Вы можете реорганизовать это потерять «естественный» командный поток, но держать вещи вместе, которые связаны друг с другом:
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
Немного лучше письменность, которая держит поток естественной команды за счет другой вилки плюс дополнительный процесс и немного другой рабочий процесс, который часто пригодится. Но это не позволяет установить переменные во внешней оболочке:
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
Кстати, если вы действительно хотите быть уверены, что bash
не вносит дополнительных файловых дескрипторов («скрыть» закрытого FD и пропустить реальная вилка), например, если вы выполняете какой-то деамон, который тогда удерживал бы замок навсегда, последний вариант рекомендуется, просто чтобы быть уверенным. lsof -nP
и strace your_script
- ваши друзья.
Thx! Именно то, что я искал. – user1050755
Не работает с 'flock 9', это только для команды' flock -o lockfile [args ..] 'case – Tino