Какая оболочка является наиболее переносимой и какие передовые методы следует использовать?

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 .

-1
02.12.2019, 18:25
4 ответа

Ваши сценарии bashдолжны работать на любой машине с установленной оболочкой bash, если только вы не используете функции bash, слишком новые для версии оболочки в другой системе, например, пытаясь используйте ссылки на имена (declare -n), ассоциативные массивы(declare -A)или формат %(...)Tprintf(или любой из множества других вещей )со значением по умолчанию 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, которые обычно можно найти, являются предикат -inamefindи тот факт, что sedчасто можно заставить понять расширенные регулярные выражения, используя -E.

Вы узнаете, какие расширения в реализациях каких инструментов, работающих на какой Unices, как себя ведут, протестировав самостоятельно (на виртуальных машинах, например ), и прочитав вопросы и ответы на этом сайте. Например, Как я могу добиться переносимости с помощью sed -i (в -редактирование места )?

Также обратите внимание, что бывают случаи, когда стандарт POSIX оставляет поведение «неопределенным».это означает, что одна и та же утилита в двух разных системах Unix, использующая параметр POSIX, может вести себя по-разному. Пример этого можно найти здесь в Почему в разрешении отказано при обновлении символической ссылки на новую цель с разрешениями в порядке?

Недостаток попыток написать чистый код оболочки POSIX заключается в том, что вы упускаете некоторые действительно полезные функции. Однажды я попытался написать эквивалентные POSIX тесты для find, для которых тестируют предикаты GNU -readable, что было непросто, и попытка сигнализировать процесс по имени, используя psи grepвместо pkill, является тема слишком много вопросов на этом сайте. Точно так же, пытаясь «оставаться POSIX», вам нужно будет держаться подальше от действительно полезных вещей, таких как perl, и вы не сможете выполнять многие административные задачи переносимым образом (, добавляя пользователей, управлять резервными копиями, передавать файлы между системами и т. д.)

В целом я предпочитаю прагматичный подход к выполнению задач, понимая при этом, что мой код, возможно, придется модифицировать для поддержки других систем позже (, если он когда-либо будет использоваться в других системах ), а не пуристский подход. Это не мешает мне писать сценарии, которые, как я знаю, будут иметь как можно меньше проблем с переносимостью (. Я бы не стал везде использовать непереносимую семантику ). Но это мое личное мнение.

7
28.01.2020, 05:06

Целью POSIX является стандартизация этих вещей, поэтому

  1. bash подходит, но используйте подмножество POSIX.
  2. Вы теряете эффективность
  3. Прочтите остальные спецификации POSIX, побродите здесь и в других местах, таких как Usenet
2
28.01.2020, 05:06

Если вы хотите писать переносимые сценарии в системах GNU/Linux, лучше всего использовать оболочку dash. Это очень портативная оболочка, которая практически не предоставляет дополнительных возможностей помимо стандартных. Это стандарт /bin/shдля систем Debian и Ubuntu. Red Hat и CentOS используют bash в качестве /bin/sh, поэтому они не подходят для тестирования переносимости.

2
28.01.2020, 05:06

Ваш вопрос кажется неправильным.

Правильным вопросом будет:"Что делать, чтобы в итоге оказаться в переносимых скриптах?"

Одной из основных проблем с переносимостью являются программы, реализующие усовершенствования, и пользователи, использующие эти усовершенствования, поскольку усовершенствования, скорее всего, отсутствуют на другой платформе 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, которые включены по умолчанию.

1
28.01.2020, 05:06

Теги

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