Я являюсь пользователем без полномочий root на общем компилированном сервере, который монтирует /home
через NFS с другого хоста. У меня есть каталог ~/a/b
с большим количеством подкаталогов c1,c2,...
Я хотел полностью удалить файл ~/a/b
и удалось выполнить большинство каталогов cN
. Но некоторые (скажем, c1
) полностью недоступны: я могу выполнить их (т.е. cd
в них), но ни один список ( ls
) не позволяет удалить их. Если я скажу rm -rf ~/a/b/c1
, процесс зависает в состоянии D
Что я могу сделать как пользователь без полномочий root, чтобы избавиться от ~/a/b
?
Обновление: я просто ssh'd на файловом сервере (чтобы исключить NFS), и я тоже не могу выполнить операцию, так что это, похоже, не проблема NFS. Однако почему ядро отказывается удалить каталог?
Удаление файла или каталога – это атомная операция, требующая одного системного вызова, поэтому, если команда rm
зависает, это связано с тем, что ядро застряло. В файловой системе NFS это может быть (и обычно есть) из-за того, что сервер не отвечает. В локальной файловой системе это может быть (и обычно есть) из-за сбоя оборудования. Возможно, ваш диск не работает; журналы ядра подтвердят это.
Проверьте, не обращаются ли какие-либо процессы к файлам под капотом (например, их текущий рабочий каталог). Я бы использовал такие инструменты, как lsof
и fuser -v
и посмотреть, есть ли какие-то процессы, запутавшиеся в каталоге, и сначала избавиться от них. При необходимости перезапустите службу nfs-клиента и попробуйте проверить, существует ли каталог, и тем более не удалять каталог, если он является текущим рабочим каталогом той же оболочки.
Если он зависает во время операции поиска и удаления, вы можете установить тайм-аут для процесса, как показано ниже (здесь я вызываю его через bash
на окнах с cygwin):
bash -c "find . -regex ".+fileDirToDelete" -exec rm -Rf {} \; & pid=$!; sleep 100; kill $pid"