Что означают поля «buff / cache» и «avail mem» вверху?

Вы можете принудительно выполнить еще один раунд оценки с помощью eval , но на самом деле это не обязательно. (И eval начинает иметь серьезные проблемы в тот момент, когда имена ваших файлов содержат специальные символы, такие как $ .) Проблема не в подстановке символов, а в раскрытии тильды.

Глобализация происходит после раскрытия переменной, если переменная не заключена в кавычки, как здесь (*) :

$ x="/tm*" ; echo $x
/tmp

Таким же образом, это похоже на то, что вы сделали , и работает:

$ mkdir -p ~/public/foo/ ; touch ~/public/foo/x.launch
$ i="$HOME/public/*"; j="*.launch"; k="$i/$j"
$ echo $k
/home/foo/public/foo/x.launch

Но с тильдой этого не происходит:

$ i="~/public/*"; j="*.launch"; k="$i/$j"
$ echo $k
~/public/*/*.launch

Это четко задокументировано для Bash:

Порядок раскрытия следующий: расширение скобок; раскрытие тильды, раскрытие параметров и переменных, ...

Раскрытие тильды происходит перед раскрытием переменной, поэтому тильды внутри переменных не раскрываются. Простое решение - использовать вместо него $ HOME или полный путь.

(* расширение глобусов из переменных обычно не то, что вам нужно)


Еще одна вещь:

Когда вы перебираете шаблоны, как здесь:

exclude="foo *bar"
for j in $exclude ; do
    ...

обратите внимание, что поскольку $ exclude - это не заключенный в кавычки, он и разделен, и в этом месте тоже скопирован.Поэтому, если текущий каталог содержит что-то, что соответствует шаблону, оно расширяется до следующего:

$ i="$HOME/public/foo"
$ exclude="*.launch"
$ touch $i/real.launch
$ for j in $exclude ; do           # split and glob, no match
    echo "$i"/$j ; done
/home/foo/public/foo/real.launch

$ touch ./hello.launch
$ for j in $exclude ; do           # split and glob, matches in current dir!
    echo "$i"/$j ; done
/home/foo/public/foo/hello.launch  # not the expected result

Чтобы обойти это, используйте переменную массива вместо разделенной строки:

$ exclude=("*.launch")
$ exclude+=("something else")
$ for j in "${exclude[@]}" ; do echo "$i"/$j ; done
/home/foo/public/foo/real.launch
/home/foo/public/foo/something else

В качестве дополнительного бонуса записи массива также может содержать пробелы без проблем с разделением.


Нечто подобное можно сделать с помощью find -path , если вас не волнует, на каком уровне каталога должны быть целевые файлы. Например. чтобы найти любой путь, заканчивающийся на / e2e / *. js :

$ dirs="$HOME/public $HOME/private"
$ pattern="*/e2e/*.js"
$ find $dirs -path "$pattern"
/home/foo/public/one/two/three/e2e/asdf.js

Мы должны использовать $ HOME вместо ~ по той же причине, что и раньше, а $ dirs необходимо не заключать в кавычки в командной строке find , чтобы он был разделен, но $ pattern следует заключить в кавычки, чтобы он случайно не расширился оболочка.

(Думаю, вы могли бы поиграть с -maxdepth в GNU find, чтобы ограничить глубину поиска, если вам интересно, но это немного другая проблема.)

{{1} }

62
22.11.2017, 09:33
2 ответа

Чтобы немного пояснить, буферы относятся к данным, которые записываются--и память которых не может быть освобождена до завершения записи.

Кэш относится к данным, которые были прочитаны,--он хранится на случай, если его нужно будет прочитать снова, но может быть немедленно восстановлен, так как его всегда можно повторно -прочитать с диска..

18
20.08.2021, 11:32

Каноническим источником этой информации является/usr/src/linux/Documentation/filesystems/proc.txt

Buffers: Relatively temporary storage for raw disk blocks shouldn't get tremendously large (20MB or so) Cached: in-memory cache for files read from the disk (the page cache). Doesn't include SwapCached.

Вы также можете найти более подробную информацию здесь .

The Linux Page Cache ("Cached:" from meminfo ) is the largest single consumer of RAM on most systems. Any time you do a read() from a file on disk, that data is read into memory, and goes into the page cache(1.).
The buffer cache ("Buffers:" in meminfo) is a close relative to the dentry/inode caches.

Или проанализируйте исходный код, например этот .

Сумма buffersявляется возвращаемым значением функцииnr_blockdev_pages(void)

long nr_blockdev_pages(void)
{
        struct block_device *bdev;
        long ret = 0;
        spin_lock(&bdev_lock);
        list_for_each_entry(bdev, &all_bdevs, bd_list) {
                ret += bdev->bd_inode->i_mapping->nrpages;
        }
        spin_unlock(&bdev_lock);
        return ret;
}

Суммаcached:

global_page_state(NR_FILE_PAGES) – total_swapcache_pages – i.bufferram
8
20.08.2021, 11:32

Теги

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