как заставить мой код использовать значение переменной $HOME?

Открытые файлы

Обычно виновниками являются процессы с открытыми файлами. Отобразите их:

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

Анонимные иноды (Linux)

Анонимные иноды могут быть созданы с помощью:

  • Временные файлы(openсO_TMPFILE)
  • inotify часы
  • [событиеfd]
  • [опрос событий]
  • [таймерфд]

Это самый неуловимый тип покемонов, и они появляются в lsofколонке TYPEкак a_inode(, которая не задокументирована на справочной страницеlsof).

Они не появятся в lsof +f -- /dev/, поэтому вам нужно:

lsof | grep a_inode

Информацию об уничтожении процессов, содержащих анонимные индексные дескрипторы, см. в разделе:List current inotify watch (pathname, PID).

0
27.11.2019, 04:41
2 ответа

С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)

См. также

1
28.01.2020, 02:38

Держите $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
0
28.01.2020, 02:38

Теги

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