Проблема: flock открывает лок-файл, делает flock(2) на этот файл, потом fork-exec, после чего спокойно выходит, надеясь, что это осовободит лок, который он сделал на лок-файл. Однако это не так, если не все форки закончили свою работу. Постановка задачи: написать скрипт, запускающий pppd (или ещё что-нибудь), но который запрещал бы запуск второй копии самого себя. Предполагаемая реализация: через lock file и вызов /usr/bin/flock примерно так: .... touch $LOCKFILE if [ l$2 = lok ]; then main else flock --timeout=0 $LOCKFILE $0 $1 ok fi Steps to Reproduce: 1.touch lock 2.flock lock bash -c "sleep 60 &" 3.flock lock bash -c "sleep 60 &" Actual Results: command #3 exits only 60 seconds after command #2 was started Expected Results: immediately
flock работает в соответствии с документацией. Не вижу проблемы.
В текущей документации такая особенность flock(1) явно не указана. Впрочем, в changelog util-linux 2.13-pre2 (http://freshmeat.net/projects/util-linux/?branch_id=11029&release_id=204182) написано следующее: - flock was replaced with flock-2.0.2 by H. Peter Anvin. ftp://ftp.kernel.org/pub/software/utils/script/flock/ (там уже лежит 2.0.3). У этого варианта flock опций побольше; в частности, есть и опция --close.
Можно обновить flock или собрать flock отдельным пакетом. Обновлять весь util-linux существенно дольше.
2 Sergey Vlasov: поставил себе, попробовал, fully satisfied. Спасибо большое за подсказку. 2 Дмитрий: может переоткрыть с FR, чтобы не забыли? Ильдар
Согласен, пусть напоминает.
В git доступна сборка 2.12r-alt2.2, в которой flock(1) сбэкпорчен из версии 2.13-pre7 Прошу всех заинтересованных потестировать. -> http://git.altlinux.org/people/php_coder/packages/?p=util-linux.git;a=commitdiff;h=74028c22428b1da7c7db48c69a14c48d852ff9d8;hp=119ef3de0d3514e3167d7b8e4e02437c45344a7e
Fixed in 2.12r-alt2.2