Почему $ RANDOM не включен в выходные данные «env»?

Память ОС v. Память Ubuntu v. Память ядра

Вы спросили, сколько использует «ОС Linux» (а не сколько памяти используется «приложениями»). «Linux» - это просто ядро ​​(хотя и не монолитное; модули ядра вносят свой вклад в эффективную площадь). Многие вещи, которые конечные пользователи считают «ОС», не являются частью ядра, а являются частью более крупного дистрибутива Ubuntu. В типичной настольной установке это включает в себя оконную систему (обычно xorg), оконный менеджер и среду рабочего стола (по умолчанию Unity в Ubuntu, другие включают Gnome и KDE), а также целый ряд других процессов, которые выполняют важные операции, поэтому что вы можете взаимодействовать со своей системой.

Слово «приложения» для конечных пользователей обычно означает такие вещи, как «веб-браузер», «электронная таблица» и т. Д. Я буду называть их «пользовательскими приложениями».

Есть способы оценить размер вашего ядра , но если вы хотите получить оценку того, сколько памяти использует Ubuntu, вам придется определить и сложить все связанные процессы ( xorg, init и т. д.).Другой вариант - использовать что-то вроде top , когда у вас нет других запущенных пользовательских приложений, и вычесть память, используемую top , эмулятором терминала и оболочкой.

Общий объем памяти

Есть много способов, некоторые из которых более точны, чем другие, чтобы увидеть использование памяти системой Linux. Также существует множество определений «используемой памяти». Тем не менее, для большинства нетехнических целей top (1) отлично справится с этой задачей:

top - 17:23:50 up 7 days, 19:15,  3 users,  load average: 0.00, 0.01, 0.05
Tasks: 172 total,   2 running, 170 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.8 us,  0.1 sy,  0.0 ni, 99.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   2049992 total,  1735420 used,   314572 free,   372420 buffers
KiB Swap:  2095100 total,      192 used,  2094908 free.   679116 cached Mem

В качестве дополнительного бонуса, поскольку следующий вопрос часто звучит так: « что такое использует память? », следующие строки показывают запущенные процессы и (среди прочего), сколько виртуальной памяти они используют.

Обратите внимание, что «свободной» памяти в Linux часто бывает очень мало, и это хорошо. Свободная память - это, по сути, потраченный впустую ресурс, поэтому Linux вместо этого выделяет ее для различных целей кэширования. Если приложению нужна эта память, она все еще доступна; Linux пока что просто находит ему хорошее применение.

23
05.07.2018, 11:31
2 ответа

RANDOMне является переменной окружения. Это переменная оболочки, поддерживаемая некоторыми оболочками. Обычно он не экспортируется по умолчанию. Вот почему он не отображается в выводе env.

После того, как он был использован хотя бы один раз, он будет отображаться в выводе set, который сам по себе содержит список переменных оболочки (и функций )и их значений в текущий сеанс оболочки. Это поведение зависит от оболочки, и при использовании pdkshв OpenBSD RANDOMбудет отображаться в set, даже если оно ранее не использовалось.


Остальная часть этого ответа касается того, что может произойти, если RANDOMбудет экспортировано (, т.е. преобразовано в переменную окружения ).

Если его экспортировать с помощью export RANDOM, он станет переменной среды, но его использование будет сильно ограничено, поскольку его значение в дочернем процессе будет «случайным, но статическим» (, что означает, что это будет неизменное случайное число ). Точное поведение различается между оболочками.

Я использую pdkshв OpenBSD в приведенном ниже примере и получаю новое случайное значение при каждом awkзапуске (, но одно и то же значение каждый раз в пределах одного и того же awkэкземпляр ). Используя bash, я получил бы точно такое же случайное значение в всех вызовах awk.

$ awk 'BEGIN { print ENVIRON["RANDOM"], ENVIRON["RANDOM"] }'
25444 25444

$ awk 'BEGIN { print ENVIRON["RANDOM"], ENVIRON["RANDOM"] }'
30906 30906

В bashэкспортируемое значение RANDOMоставалось бы статичным независимо от использования RANDOMв оболочке (, где каждое использование $RANDOMпо-прежнему давало бы новое значение ).

Это связано с тем, что каждая ссылка на переменную оболочки RANDOMв bashзаставляет оболочку обращаться к своей внутренней get_random()функции, чтобы присвоить переменной новое случайное значение, но оболочка не обновляет переменная окруженияRANDOM. Это похоже на поведение других динамических bashпеременных, таких как LINENO, SECONDS, BASHPIDи т. д.

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

export RANDOM="$RANDOM"

Мне неясно, будет ли это иметь дополнительный побочный эффект повторного -заполнения генератора случайных чисел в bashили нет (, но можно предположить, что )нет.

42
27.01.2020, 19:41

Большинство оболочек имеют ряд других установленных или используемых оболочкой переменных, которые по умолчанию не экспортируются в дочерние процессы.

В Bash есть несколько явно -специфичных для Bash:

$ echo "${!BASH*}"
BASH BASHOPTS BASHPID BASH_ALIASES BASH_ARGC BASH_ARGV BASH_CMDS BASH_COMMAND BASH_LINENO BASH_SOURCE BASH_SUBSHELL BASH_VERSINFO BASH_VERSION
$ echo $BASH_VERSION
4.4.12(1)-release
$ env|grep -c BASH
0

Затем есть более стандартные, такие как OPTINDи OPTERR(, используемые getopts), и PS2,PS3(вторичные подсказки )и даже другая «волшебная» переменная:SECONDS(показывает время в секунд с момента запуска оболочки)

В Bash вы можете увидеть все переменные и статус их экспорта с помощью declare -p. Помеченные -xэкспортируются, без x— нет. (Некоторые будут иметь другие флаги, такие как iдля целого числа или rтолько для чтения -.)

В Zsh или ksh93 вы можете использовать typeset -p, хотя Zsh помечает экспортированные переменные, изменяя typesetна exportв выводе вместо использования флагов. exportсам по себе также покажет все экспортированные переменные, но это примерно тот же результат, который вы получите, запустив env.

4
27.01.2020, 19:41

Теги

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