Благодаря Mark Plotnick я смог определить и устранить проблему.
Проблема заключается во взаимодействии между файловой системой AFS, используемой сервером, и Kerberos, выполняющим аутентификацию. Та же проблема была поднята в этом вопросе на SO.
По сути, происходит следующее: когда я вхожу на сервер по ssh, Kerberos выдает токен аутентификации для сессии. Этот токен также используется для доступа к файловой системе AFS. При закрытии сеанса SSH этот токен уничтожается, и запущенные процессы начинают получать ошибки отказа в разрешении при попытке доступа к файлам на AFS.
Способ исправить это - запустить новое окно внутри screen
/tmux
и запустить команду:
kinit && aklog
После этого вы можете отсоединиться от screen
/tmux
и безопасно закрыть сессию ssh.
Команды выше создают новые токены Kerberos и связывают их с сессией screen
/tmux
, таким образом, при закрытии ssh-соединения начальные токены будут отозваны, но поскольку подпроцессы теперь используют созданные вами токены, они не будут страдать от ошибок отказа в разрешении.
Подведем итоги:
ssh username@server
tmux
kinit && aklog
Проблема в том, что рекурсивное удаление rm -r *
ведет себя иначе, чем нерекурсивное rm *
в отношении скрытых файлов. Первый удаляет их, а второй нет (с параметрами оболочки по умолчанию). Но, конечно, рекурсия нужна для того, чтобы удалять подкаталоги.
Мое решение состоит в том, чтобы использовать перемещение, которое оставляет скрытые файлы на месте, вместо удаления. Это еще пара строк, но имеет смысл, когда вы это делаете (нет лишних вариантов для запоминания).
mkdir ../deleteme
mv * ../deleteme
rm -rf ../deleteme
rm *
отлично работает, если ваш каталог не содержит подкаталогов (см. ответ @kos). Однако, если вам нужно рекурсивное решение, которое также удаляет все подкаталоги, то (, как указал @meesern ,)rm -r *
не то, что вам нужно, поскольку действительно удаляет скрытые файлы и подкаталоги.
Вместо этого вы можете использовать find
для отображения и удаления не -скрытых файлов и подкаталогов (, адаптированных из этого ответа):
find YOUR_DIRECTORY -not -path '*/\.*' -delete
Это приведет к удалению всех не-скрытых файлов в YOUR_DIRECTORY
и всех подкаталогах, которые стали пустыми после удаления не-скрытых файлов.
Он не будет удалять содержимое внутри скрытого каталога (, например. YOUR_DIRECTORY/.foo/bar/baz
). В результате вы можете получить некоторые предупреждения, такие как
find: cannot delete 'some/directory/here': Directory not empty
Но вы можете смело игнорировать их.