Является ли flock & exec безопасным в bash?


13

"Стандартный" фрагмент блокировки, который я видел, выглядит примерно так ...

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

Насколько безопасно (кажется, что тестирование говорит об этом) использовать execв этот момент? Будет ли подпроцесс сохранять блокировку?

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

Я смутно помню, что процессы exec'd сохраняют дескрипторы открытых файлов, и поскольку flock использует файловые дескрипторы, он должен работать. Но я не могу найти какую-либо документацию, которая делает это окончательным и ясным.

Для записи, это специфично для Linux.

Ответы:


3

Да, замки сохранились поперек exec. Блокировки сохраняются во всем системном вызове execve, пока дескриптор файла остается открытым. Файловые дескрипторы остаются открытыми, execveесли только они не были настроены на закрытие в exec, а файловые дескрипторы, созданные перенаправлением оболочки, не помечаются как закрытые при исполнении.


6

Да, это так. Exec просто заменяет образ процесса, но это все тот же процесс, поэтому связанные с ним блокировки на уровне ОС остаются прежними.

Это очень легко проверить, что это работает:

замок

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

скрипт

sleep 100

Попробуйте запустить ./lockдважды в течение следующих 100 секунд. Вы получите блокировку только один раз, поэтому execона не снимает блокировку.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.