Оказывается, мой предыдущий open $dir
вызов запускал один из подкаталогов каталога, который я хочу удалить, в macOS Finder (настольном приложении файлового браузера ).
Похоже, что macOS выдает эту загадочную ошибкуDirectory not empty
(ENOEMPTY ), если есть процесс, который блокирует один из файлов/каталогов в том каталоге, который вы хотите удалить.
Теперь я решил эту проблему, используя совершенно другой способ убедиться, что сценарий выполняется только один раз. Это не отвечает на мои первоначальные вопросы, но я поделюсь им здесь, если он будет полезен другим:
Сейчас я проверяю с помощью pgrep, сколько процессов запущено с тем же именем. На это мне указали как на возможность в Твиттере. Единственный возможный недостаток этого подхода, который я вижу, заключается в том, что он будет мешать, если у вас есть несколько сценариев с одним и тем же именем. Но этого можно избежать, имея достаточно конкретные имена скриптов.
Вот код, который я использую:
PNAME="$(basename "$0")"
if [[ "$(pgrep -c -u $USER $PNAME )" -ne 1 ]]; then
exit 1
fi
Я столкнулся с той же проблемой с flock. Предложение jh использовать термоблок помогло мне отследить проблему. Оказалось, что команда, которую я запускал с помощью flock, запускала дочерний процесс, который оставался в фоновом режиме. поэтому, даже если исходная команда завершена, flock не разблокирует файл, потому что дочерний процесс удерживает блокировку.
Решение :стадо --закрыть
«man flock» говорит, что --close будет «закрывать дескриптор файла, на котором удерживается блокировка, перед выполнением команды. Это полезно, если команда порождает дочерний процесс, который не должен удерживать блокировку».
Это полностью решило мою проблему.