Обычно виновниками являются процессы с открытыми файлами. Отобразите их:
lsof +f --
Преимущество использования /dev/
вместо/mountpoint
:заключается в том, что точка монтирования исчезнет после umount -l
или может быть скрыта наложенным монтированием.
fuser
также можно использовать, но, на мой взгляд, lsof
имеет более полезный результат. Однако fuser
полезен, когда дело доходит до уничтожения процессов, вызывающих ваши драмы, чтобы вы могли продолжать свою жизнь.
Список файлов на
(см. предостережение выше):
fuser -vmM
Интерактивно уничтожать только процессы с файлами, открытыми для записи:
fuser -vmMkiw
После повторного монтирования читать только -(mount -o remount,ro
), безопасно (r )убить все оставшиеся процессы:
fuser -vmMk
Виновником может быть само ядро. Другая файловая система, смонтированная в файловой системе, которую вы пытаетесь umount
смонтировать, вызовет проблемы. Проверьте с помощью:
mount | grep /
Для петлевых креплений также проверьте выходные данные:
losetup -la
Анонимные иноды могут быть созданы с помощью:
open
сO_TMPFILE
)Это самый неуловимый тип покемонов, и они появляются в lsof
колонке TYPE
как a_inode
(, которая не задокументирована на справочной страницеlsof
).
Они не появятся в lsof +f -- /dev/
, поэтому вам нужно:
lsof | grep a_inode
Информацию об уничтожении процессов, содержащих анонимные индексные дескрипторы, см. в разделе:List current inotify watch (pathname, PID).
Сenvsubst
-заменой вашей петли for/cat
на петлю while/read
по причинам, обсуждаемым здесь:
#!/bin/bash
while IFS= read -r i
do
if [[ -O $i ]] && [[ -d $i ]]; then
echo "found it: $i"
break
else
echo "$i is not it."
fi
done < <(envsubst < mylist.txt)
См. также
Держите $HOME
подальше от вашего файла и используйте его в своем скрипте. Например
$ cat mylist.txt
most_impt_dir1
most_impt_dir2
most_impt_dir3
misc
junk
Тогда:
while IFS= read -r i;
do
dir=$HOME/$i
if [[ -O $dir ]]...
...
fi
done < mylist.txt
Другой вариант, если вы используете bash, состоит в том, чтобы сохранить список в виде массива bash и указать файл, чтобы получить список:
$ cat mylist.txt
dirs=(
"$HOME/most_impt_dir1"
"$HOME/most_impt_dir2"
"$HOME/most_impt_dir3"
"$HOME/misc"
"$HOME/junk"
)
Тогда скрипт будет такой:
source./mylist.txt
for dir in "${dirs[@]}"
do
if [[ -O $dir...
...
fi
done