du не может получить доступ к файлу - Никакая такая ошибка файла или каталога

Получил ответ:

$ read IPETH0 IPLO <<< $(ifconfig | awk '/inet[[:space:]]/ { print $2 }' | cut -d ':' -f 2)
$ echo "${IPETH0}"
192.168.23.2
$ echo "${IPLO}"
127.0.0.1

Это принимает порядок eth0 и lo интерфейсы, но это показывает основную идею.

Чистый awk

Можно сделать это исключительно в awk использование split функция:

$ read IPETH0 IPLO <<< $(ifconfig | awk '/inet[[:space:]]/ { split($2,a,":"); print a[2]}')
4
29.06.2014, 01:19
2 ответа

du , как и любая команда, рекурсивно просматривающая деревья каталогов, работает следующим образом:

  1. Прочитать информацию о файле, доступ к которому осуществляется через его путь¹. В случае du системный вызов stat предоставляет тип файла (в частности, каталог) и размер. Изначально имена берутся из командной строки.
  2. Если файл является каталогом, откройте его и прочтите список имен файлов.
  3. Для каждого имени файла в каталоге создайте путь к файлу ( DIRECTORY / ENTRY_NAME ) и действуйте рекурсивно, начиная с шага 1. Этот шаг может быть выполнен частично параллельно с предыдущим (зависит от реализации).

rm работает и удаляет файлы один за другим. Иногда du считывает имя файла на шаге 2, но к тому времени, когда он начинает обрабатывать его на шаге 3, rm удаляет его. Видите ли вы эту ошибку вообще и сколько раз зависит от относительной скорости rm и du и в значительной степени непредсказуемо.

¹ Существует только два способа прямого доступа к файлу: по пути (включая информацию о каталоге, относительную или абсолютную) или (если файл открыт) по дескриптору.

1
27.01.2020, 21:02

Просто проигнорируйте ошибку du command

Согласно этой ссылке, я мог бы проигнорировать ошибки du, просто упомянув,

du 2> >(grep -v '^du: cannot \(access\|read\)' >&2)

Но мне более конкретно интересно знать, что происходит с удалением файлов. Особенно меня интересует, почему команда du не могла указать размер и почему она сообщает об ошибке, когда команда rm развязала файлы.

Это объясняется в ссылке на эту . Я просто перефразирую, чтобы посмотреть, что здесь произошло.

  1. Команда rm развязала связь с файлом. (т.е. удалить имя файла запись из родительской директории).
  2. Но файловая рукоятка все еще остается действительной, хотя файла нет. имя, связанное с ним. Именно здесь команда du сообщает, что он не видит ни файла, ни каталога.

Верификация

Я провел еще несколько исследований по проверке того, что файлы на самом деле не связаны.

Я получил pid процесса rm, используя ps команду. Теперь я выдал следующую команду, чтобы проверить, доступны ли файлы.

lsof +L | grep 11771

Команда, приведенная выше, дала мне нижеследующий вывод.

rm   11771  root  4r DIR  8,17 175882240     2   47333397 /foldername/filename

Итак, согласно вышеуказанному выводу, файл не связан.

Поскольку команда rm все еще выполняется, команда du сообщает об ошибке.

0
27.01.2020, 21:02

Теги

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