how to find out the total memory allocated for a particular process in ubuntu?
Вы не определяете, что такое память, выделенная для процесса, и на самом деле это довольно сложный вопрос (как насчет отображений разделяемой памяти -см. mmap (2)для подробностей; как насчет разделяемой памяти POSIX -см. shm _обзор (7)для получения дополнительной информации; как насчет некоторых страниц в кэше страниц , используемых для открытых файлов; и т.д...)
Вы можете использовать
/proc/
файловую систему (, которая, кстати, используетсяps
,pmap
,top
,htop
и т.д.... ). Прочтите proc (5)для получения дополнительной информации. В частности, для процесса pid 1234 вы можете использовать/proc/1234/status
,/proc/1234/statm
,/proc/1234/maps
и т. д. Все они представляют собой текстовые псевдофайлы -(, немного похожие на конвейеры ), которые вы можете увидеть с помощьюcat
(или прочитать последовательно внутри какой-нибудь программы ). Кстати, внутри программы вы можете использовать/proc/self
(, которая является псевдосимволической ссылкой ), например. читать последовательно/proc/self/status
и т.д...См. также LinuxAteMyRam .
Ваши сценарии bash
должны работать на любой машине с установленной оболочкой bash
, если только вы не используете функции bash
, слишком новые для версии оболочки в другой системе, например, пытаясь используйте ссылки на имена (declare -n
), ассоциативные массивы(declare -A
)или формат %(...)T
printf
(или любой из множества других вещей )со значением по умолчанию bash
в macOS (, которое является древним; просто установите более новый bash
с Homebrew в этом случае ). Ваши сценарии также могут дать сбой, если они используют внешние инструменты, недоступные в какой-либо другой системе, или функции инструментов, которые могут быть не реализованы или реализованы по-другому.
Наиболее переносимым языком оболочки в системах POSIX является оболочка sh
. Это описано здесь:https://pubs.opengroup.org/onlinepubs/9699919799/idx/shell.html
Оболочка bash
(и другие )реализуют sh
с расширениями. Некоторые оболочки, такие как fish
или zsh
, даже не пытаются быть sh
оболочками (, но zsh
обеспечивают степень «sh
- эмуляции» через --emulate sh
), в то время как оболочки, подобныеdash
пытается быть более чистым по отношению к стандарту POSIX sh
(, но все же с некоторыми расширениями ).
Как правило, аспекты оболочки, относящиеся к синтаксису и встроенным функциям , должны быть «переносимыми», если сценарий всегда выполняется в одной и той же оболочке (и версии. оболочки, в некоторой степени ), даже если эта оболочка является оболочкой fish
. Это тот же тип «переносимости», что и у сценариев Python, Perl и Ruby. Однако всегда должна быть доступна оболочка sh
(, обычно устанавливаемая как /bin/sh
), которая обычно bash
,dash
или ksh
работают в каком-то «режиме совместимости».
Наиболее переносимыми утилитами в системе POSIX являются утилиты POSIX. Они описаны здесь:https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
Утилиты GNU, описанные в coreutils
, реализуют утилиты POSIX (, что, как указывает пользователь schily в комментариях , не означает, что они совместимы с POSIX-), а затем расширяет их функциями, которые в основном предназначены для удобства. Это справедливо и для соответствующих утилит в других Unix-системах. Также обратите внимание, что пакет GNU coreutils
для Linux не содержит всех утилит, указанных в POSIX, и такие утилиты, как find
, sed
, awk
и другие, которые являются утилитами POSIX, упакованы отдельно.
До тех пор, пока вы пользуетесь POSIX-утилитами и используете их POSIX-поведение (с точки зрения параметров и т. д. ), в скриптах, использующих синтаксис POSIX sh
, вы, скорее всего, будете «в основном переносимыми». в большинстве систем Unix. Но также обратите внимание, что существуют не -утилиты POSIX и не -расширения POSIX для утилит POSIX, которые по-прежнему достаточно переносимы, потому что они обычно реализуются. Примерами распространенных утилит, отличных от -POSIX, являются pkill
, tar
и gzip
. Примерами не -расширений POSIX для утилит POSIX, которые обычно можно найти, являются предикат -iname
find
и тот факт, что sed
часто можно заставить понять расширенные регулярные выражения, используя -E
.
Вы узнаете, какие расширения в реализациях каких инструментов, работающих на какой Unices, как себя ведут, протестировав самостоятельно (на виртуальных машинах, например ), и прочитав вопросы и ответы на этом сайте. Например, Как я могу добиться переносимости с помощью sed -i (в -редактирование места )?
Также обратите внимание, что бывают случаи, когда стандарт POSIX оставляет поведение «неопределенным».это означает, что одна и та же утилита в двух разных системах Unix, использующая параметр POSIX, может вести себя по-разному. Пример этого можно найти здесь в Почему в разрешении отказано при обновлении символической ссылки на новую цель с разрешениями в порядке?
Недостаток попыток написать чистый код оболочки POSIX заключается в том, что вы упускаете некоторые действительно полезные функции. Однажды я попытался написать эквивалентные POSIX тесты для find
, для которых тестируют предикаты GNU -readable
, что было непросто, и попытка сигнализировать процесс по имени, используя ps
и grep
вместо pkill
, является тема слишком много вопросов на этом сайте. Точно так же, пытаясь «оставаться POSIX», вам нужно будет держаться подальше от действительно полезных вещей, таких как perl
, и вы не сможете выполнять многие административные задачи переносимым образом (, добавляя пользователей, управлять резервными копиями, передавать файлы между системами и т. д.)
В целом я предпочитаю прагматичный подход к выполнению задач, понимая при этом, что мой код, возможно, придется модифицировать для поддержки других систем позже (, если он когда-либо будет использоваться в других системах ), а не пуристский подход. Это не мешает мне писать сценарии, которые, как я знаю, будут иметь как можно меньше проблем с переносимостью (. Я бы не стал везде использовать непереносимую семантику ). Но это мое личное мнение.
Если вы хотите писать переносимые сценарии в системах GNU/Linux, лучше всего использовать оболочку dash
. Это очень портативная оболочка, которая практически не предоставляет дополнительных возможностей помимо стандартных. Это стандарт /bin/sh
для систем Debian и Ubuntu. Red Hat и CentOS используют bash в качестве /bin/sh
, поэтому они не подходят для тестирования переносимости.
Ваш вопрос кажется неправильным.
Правильным вопросом будет:"Что делать, чтобы в итоге оказаться в переносимых скриптах?"
Одной из основных проблем с переносимостью являются программы, реализующие усовершенствования, и пользователи, использующие эти усовершенствования, поскольку усовершенствования, скорее всего, отсутствуют на другой платформе UNIX.
Вот список частых причин проблем с переносимостью:
Программы GNU рекламируют, например,. Длинные параметры в стиле GNU, такие как --long
, которые на 100% не переносимы. Никогда не используйте их в переносимых скриптах.
bash реализует ksh -стиль усовершенствования, такие как [[ -z $HOME ]]
. Это функция, которой нет в POSIX, и только ksh88, ksh93, bash, mksh реализуют ее.
bash (, если он не скомпилирован с параметрами компиляции, используемыми Mac OS и Solaris )реализует встроенную функцию, отличную от -POSIX echo
, которая конфликтует с поведением UNIX. Будьте осторожны, но также обратите внимание, что:
printf также не является окончательным решением, так как существуют printf
реализации, которые неправильно обрабатывают нулевые байты в строковых параметрах, а также поскольку разные реализации printf имеют разный набор функций.
Номера сигналов, кроме 1, 2, 3, 6, 9, 14 и 15, -не переносимы. Связанные сигналы имеют разные сопоставления имени/номера в разных версиях UNIX.
Математика оболочки POSIX, подобная echo $(( a + b ))
, может вызвать проблемы с переносимостью, поскольку разные оболочки поставляются с разным набором поддерживаемых функций. Обратите внимание, что POSIX требует только ограниченного набора функций.
Оболочка POSIX обычно , а не в /bin/sh
, поскольку POSIX не работает с именами путей, за исключением того, что для этого требуется dev/tty
. Если вы хотите запустить оболочку POSIX, вызовите getconf PATH
и используйте результат как PATH
для вашей оболочки, затем введите sh
, и вы получите оболочку POSIX.
Даже все остальные утилиты, ожидаемые пользователями в рамках /bin
или /usr/bin
, обычно не являются POSIX-вариантами утилит. Вам необходимо позвонить:
PATH=`getconf PATH`
export PATH
sh
, чтобы получить оболочку POSIX, и эта оболочка POSIX вызывает варианты утилит POSIX.
Многие люди рекомендуют использовать dash
для тестов, но это проблема, потому что dash
не совместим с POSIX, так как не реализует поддержку многобайтовых символов.
Я рекомендую использовать pbosh
, который является вариантом компиляции bosh
. pbosh
реализует минимальные функции POSIX, которые включены по умолчанию.