Обработка устаревших блокировок файлов в Linux и надежное использование flock

Оказывается, мой предыдущий open $dirвызов запускал один из подкаталогов каталога, который я хочу удалить, в macOS Finder (настольном приложении файлового браузера ).

Похоже, что macOS выдает эту загадочную ошибкуDirectory not empty(ENOEMPTY ), если есть процесс, который блокирует один из файлов/каталогов в том каталоге, который вы хотите удалить.

4
20.06.2020, 16:47
2 ответа

Теперь я решил эту проблему, используя совершенно другой способ убедиться, что сценарий выполняется только один раз. Это не отвечает на мои первоначальные вопросы, но я поделюсь им здесь, если он будет полезен другим:

Сейчас я проверяю с помощью pgrep, сколько процессов запущено с тем же именем. На это мне указали как на возможность в Твиттере. Единственный возможный недостаток этого подхода, который я вижу, заключается в том, что он будет мешать, если у вас есть несколько сценариев с одним и тем же именем. Но этого можно избежать, имея достаточно конкретные имена скриптов.

Вот код, который я использую:

PNAME="$(basename "$0")"
if [[ "$(pgrep -c -u $USER $PNAME )" -ne 1 ]]; then
    exit 1
fi
0
18.03.2021, 23:26

Я столкнулся с той же проблемой с flock. Предложение jh использовать термоблок помогло мне отследить проблему. Оказалось, что команда, которую я запускал с помощью flock, запускала дочерний процесс, который оставался в фоновом режиме. поэтому, даже если исходная команда завершена, flock не разблокирует файл, потому что дочерний процесс удерживает блокировку.

Решение :стадо --закрыть

«man flock» говорит, что --close будет «закрывать дескриптор файла, на котором удерживается блокировка, перед выполнением команды. Это полезно, если команда порождает дочерний процесс, который не должен удерживать блокировку».

Это полностью решило мою проблему.

0
18.03.2021, 23:26

Теги

Похожие вопросы