Поиск по сайту:

Как сделать ваши Bash-скрипты аппаратно-ориентированными


Написание скриптов для запуска на разных компьютерах с Linux — сложная задача. Вы не можете предположить, что у них будут одинаковые характеристики. Команда getconf позволяет проверить сотни значений операционной системы и файловой системы.

Аппаратные сценарии

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

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

Команда getconf может сообщать буквально о сотнях различных характеристик операционной системы и файловой системы. Некоторые из них принимают форму пар значений, одно из которых соответствует максимальному значению системы, а другое — минимальному. Это означает, что вы можете проверить параметры оборудования или файловой системы, чтобы убедиться, что ваш скрипт будет реагировать соответствующим образом.

Конечно, ваш скрипт не может использовать getconf на целевом компьютере, если он не установлен на этом компьютере. Во всех дистрибутивах, протестированных при написании этой статьи, уже был установлен getconf, включая Ubuntu, Fedora и Manjaro. Интересно, что все они имели одинаковую версию getconf, версию 2.33.

Первые шаги с командой getconf

Вы можете проверить, установлен ли на вашем компьютере getconf, и узнать его версию, используя параметр --version.

getconf --version

Чтобы увидеть, сколько элементов может сообщить getconf, используйте параметр -a (все) и передайте его через команду wc. Это будет подсчитывать строки, слова и символы в выводе.

getconf -a | wc

В выводе 320 строк. Чтобы просмотреть весь список в управляемом виде, мы направим вывод в less.

getconf -a | less

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

Некоторые элементы являются дубликатами. Многие из них могут быть вызваны более коротким именем или более длинным именем, совместимым с POSIX.

Отчет по отдельным значениям

Чтобы заставить getconf сообщать об одном значении, передайте имя значения в getconf в командной строке. Обратите внимание, что все имена опций в верхнем регистре.

getconf LONG_BIT

Опция LONG_BIT сообщает о том, является ли ваше ядро и, следовательно, ваша операционная система 32-разрядной или 64-разрядной. Для этой команды не требуются никакие другие параметры, только сама опция LONG_BIT. Еще одно простое значение для отчета — LOGIN_NAME_MAX .

getconf LOGIN_NAME_MAX

Это странно высокая максимальная длина имени пользователя, но это правда. Если вы действительно хотите создать учетную запись пользователя с нелепо длинным именем пользователя, вы можете это сделать. Напротив, имя хоста этого компьютера имеет максимальную длину 64 символа:

getconf HOST_NAME_MAX

Чтобы узнать, сколько одновременных процессов может выполнять учетная запись пользователя, используйте параметр CHILD_MAX:

getconf CHILD_MAX

Значение OPEN_MAX возвращает максимальное количество файлов, которые может открыть процесс.

getconf OPEN_MAX

Чтобы увидеть подмножество значений getconf, мы можем использовать параметр -a (all) для создания всех значений и использовать grep для отфильтруйте те, которые нас интересуют. Например, чтобы увидеть каждое значение, в заголовке которого есть «ИМЯ», используйте:

getconf -a | grep NAME

Аналогичным образом, чтобы увидеть все значения с «GROUP» в названии, используйте:

getconf -a | grep GROUP

Чтобы увидеть значения, в заголовке которых есть «INT_», используйте:

getconf -a | grep _INT

Это показывает максимальное и минимальное значения, которые может содержать целочисленная переменная на этом компьютере.

Использование getconf со значениями файловой системы

Когда вы используете какие-либо параметры, относящиеся к характеристикам файловой системы, вам нужно указать getconf, о какой файловой системе он должен сообщать. Вам нужно сделать это, даже если у вас есть только один жесткий диск и одна файловая система, установленная на нем. Команда getconf ничего не предполагает. Чтобы указать файловую систему, о которой должен сообщать getconf, вы должны указать путь к каталогу в этой файловой системе.

Чтобы увидеть максимальную длину имени файла для файловой системы, смонтированной в корне дерева каталогов файловой системы, введите:

getconf NAME_MAX /

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

Это именно то, что происходит, когда вы вставляете карту памяти USB, как в этом примере. Карта памяти называется «PINK» и монтируется в «/media/dave/».

getconf NAME_MAX /media/dave/PINK/

Мы можем проверить, какая файловая система находится на USB-накопителе, используя команду df, чтобы узнать, к какому блочному устройству он подключен. Затем мы используем команду lsblk с параметром -f (файловая система).

df /media/dave/PINK
lsblk -f /dev/sdb1

Карта памяти — это блочное устройство /dev/sdb1, а файловая система — FAT32. Вот почему мы получаем разные результаты для двух каталогов в одном дереве каталогов. Они находятся в одном дереве каталогов, но имеют разные базовые файловые системы.

Использование getconf в скриптах

Мы можем легко включить вывод getconf в решения внутри наших сценариев оболочки.

Например, для выполнения различных действий в зависимости от того, работает ли сценарий в 32-разрядной или 64-разрядной операционной системе, вы можете использовать такой раздел сценария.

#!/bin/bash

# are we on a 32 or 64 bit OS?
if [ $(getconf LONG_BIT) = "64" ]
then
  # 64 bit
  echo "64-bit machine."
else
  # 32 bit
  echo "32-Bit machine."
fi

Оператор if сравнивает выходные данные команды getconf LONG_BIT со значением 64. Если они совпадают, выполняется предложение then, в противном случае выполняется предложение else. Вы можете либо выполнять действия, зависящие от версии, в предложениях then/else, либо устанавливать флаги переменных, которые можно проверить в другом месте вашего скрипта.

Скопируйте текст сценария в редактор и сохраните файл как «hw-test.sh». Мы сделаем скрипт исполняемым с помощью команды chmod и параметра -x (исполняемый).

chmod +x hw-test.sh

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

./hw-test.sh

Опция Overkill

Количество значений, о которых может сообщить getconf, может быть ошеломляющим. Страница man на удивление краткая. Если вы ожидаете, что он перечислит варианты и объяснит каждый из них, вы будете разочарованы.

Вы найдете некоторые описания на страницах man для sysconf и confstr. Возможно, вам придется обрезать несколько символов перед записями confstr. Например, это не сработало:

getconf _CS_GNU_LIBC_VERSION

но это сделало:

getconf GNU_LIBC_VERSION

Вы также найдете некоторые описания в файле «limits.h». Если вы не знаете, где находится этот файл в вашей системе, используйте:

whereis limts.h 

Затем вы можете использовать less для просмотра этого файла.