|
Bog BOS: Управление переменными окружения - Environment Modules
|
Последнее изменение файла: 2012.11.28
Скопировано с www.bog.pp.ru: 2024.11.23
Bog BOS: Управление переменными окружения - Environment Modules
Пакет Environment Modules предназначен для управления установкой переменных окружения
командной оболочки (bash, ksh, zsh, sh, csh, tcsh, perl) с целью запуска различных версий
приложения или различных приложений.
Описание переменных окружения оболочки для каждой версии приложения оформляется в виде
описания модуля. При инициализации оболочки обеспечивается инициализация системы
управления модулями, в частности задаются начальные значения переменных окружения
самой системы модулей и наличие команды module, вызываемой затем пользователем.
Основная функция команды module - загрузка модуля - рекурсивный поиск
(список каталогов поиска в MODULEPATH, подкаталог можно задавать явно)
и интерпретация (выполнение) описания модуля,
обеспечивающее устанавливку значений переменных окружения, требуемых приложению
(PATH, MANPATH, LD_LIBRARY_PATH и др.).
При выгрузке модуля состояние переменых окружения возвращается в исходное состояние.
В качестве имени модуля используется имя файла (с указанием подкаталогов).
Описание модулей делается на языке Tcl (включая условные выражения,
зависящие от текущего значения переменных окружения) и представляет собой набор
команд Tcl, включая TclX и расширения Tcl от системы модулей
(при выгрузке модуля выполняются обратные команды, по возможности).
Описание требуемых изменений значений переменных окружения не зависит от типа используемой
командной оболочки (конечно, из списка поддерживаемых).
Есть поддержка версий самой системы модулей (не разбирался).
Реализован на C, но с использованием libtcl8.4 (были реализации на sh и tcl).
Для сборки также требуются tcl-devel [и tclx-devel].
Имеются готовые пакеты environment-modules (версия 3.2.6) для RHEL в репозиториях
EPEL (поиск модулей задаётся в /usr/share/Modules/init/.modulespath;
при установке там указаны /etc/modulefiles и /usr/share/Modules/modulefiles;
затирается при обновлении пакета, также как и /usr/share/Modules/etc/rc) и Modules для SuSE.
Для установки требуются пакеты tcl [и tclx].
Некоторые ключи ./configure (./configure --help):
- --prefix (/usr/local; куда (начало поддерева) устанавливать файлы, независимые от архитектуры)
- --exec-prefix (PREFIX; куда устанавливать файлы, зависимые от архитектуры)
- --sysconfdir (PREFIX/etc; куда устанавливать конфигурационные файлы)
- --enable-versioning (по умолчанию; поддержка различных версий самой системы модулей)
- --enable-cache выключено; использовать кеширование в каталогах из списка поиска modulefile)
- --enable-logging (выключено; включить поддержку вывода на syslog)
)
- --with-x
- --with-tclx (выключено)
- --with-module-path (список каталогов поиска modulefile)
Описание модуля начинается с магического комментария
(в конце может стоять номер версии формата: "1.0"):
#%Module
Специфические для системы модулей команды Tcl (и модифицированные):
- setenv имя-переменной-окружения значение
- unsetenv имя-переменной-окружения [значение]
- append-path имя-переменной-окружения значение (добавить значение в конец списка
(через двоеточие), содержащегося в переменной окружения)
- prepend-path имя-переменной-окружения значение (добавить значение в начало списка
(через двоеточие), содержащегося в переменной окружения)
- remove-path имя-переменной-окружения значение (удалить значение из списка)
- prereq имя-модуля ... (проверяется наличие указанного модуля в списке загруженных;
указание нескольких модулей внутри одной команды - логическое ИЛИ;
указание нескольких команд - логическое И;
можно указывать имя каталога, содержащего альтернативные модули)
- conflict имя-модуля ... (проверяется отсутствие указанного модуля в списке загруженных;
указание нескольких модулей внутри одной команды - логическое ИЛИ;
указание нескольких команд - логическое И;
можно указывать имя каталога, содержащего альтернативные модули)
- break (модуль считается незагруженным, хотя все команды из описания выполнены)
- is-loaded имя-модуля ... (возвращает "true", если один из указанных модулей загружен;
можно указывать имя каталога, содержащего альтернативные модули)
- module имя-подкоманды аргументы (выполнить указанную подкоманду;
борьба с рекурсиями - забота пользователя)
- module-info flags (возвращает значение ключей запуска module[cmd])
- module-info mode (возвращает текущий режим: load, remove, display, switch и др.)
- module-info name (возвращает имя модуля)
- module-info shell (возвращает имя командной оболочки)
- module-info shelltype (возвращает тип командной оболочки)
- module-alias имя-синонима имя-модуля (назначение синонима для модуля,
должно быть в одном из файлов с настройками)
- module-log {trace | panic | fatal | error | prob | warn | info | verb | debug}
{null | stderr | stdout | имя-файла | источник-syslog.уровень} (что выводить и куда)
- module-trace {on|off} [{load | unload | init | use | unuse | clear | purge | switch |
update | avail | display | help | list}...] [-module {шаблон-имени-модуля}...] (включить
или выключить трассировку вызова команды module с соответствующим фильтрованием;
не забудьте включить вывод журнала для уровня trace)
- module-user {advanced | expert | novice} (не все возможности доступны новичкам)
- module-verbosity {on|off}
- module-whatis описание-модуля (выдаётся подкомандами whatis и apropos)
- set-alias имя-команды тело-команды (задать alias для bash)
- unset-alias имя-команды
- system строка (выполнить указанную строку в командной оболочке)
- uname {sysname | nodename | domain | release | version | machine}
Переменные
- ModulesCurrentModulefile - содержит полное имя файла с описанием модуля
- ModulesVersion - устанавливается в файлах настройки .version,
определяет имя файла в каталоге по умолчанию, если в качестве имени модуля было указано
имя каталога без уточнения имени файла в нём
Подпрограмма ModulesHelp в теле описания модуля позволяет задать текст,
который будет выводить команда "module help имя-модуля".
Подпрограмма ModulesDisplay в теле описания модуля позволяет задать дополнительный текст,
который будет выводить команда "module display имя-модуля".
При запуске командной оболочки bash выполняется ~/.bash_profile,
который выполняет ~/.bashrc, который выполняет /etc/bashrc, который выполняет
скрипты /etc/profile.d/*.sh, среди которых есть /etc/profile.d/modules.sh,
устанавливающий переменные окружения (MODULESHOME, LOADEDMODULES, MODULEPATH)
для системы модулей и создаёт макрокоманду module.
Для командных оболочек csh (ksh) используется /etc/profile.d/modules.csh.
Текущее состояние переменных окружения запоминается в ~/.modulesbeginenv
(а если параллельно выполняется несколько командных оболочек? а разных оболочек?).
Команды инициализации берутся из ${MODULESHOME}/init/bash (csh, ksh, sh, perl, python, tcsh, zsh).
Переменная окружения MODULEPATH задаёт список каталогов (через двоеточие),
в которых ищутся описания модулей. Первоначальный список берётся из ${MODULESHOME}/init/.modulespath.
Переменные окружения:
- MODULEPATH - список каталогов для поиска модулей (через двоеточие)
- MODULESHOME - каталоги с описанием модулей и скрипты инициализации
- LOADEDMODULES - список загруженных модулей (через двоеточие)
- _LOADED_MODULEFILES_ - список полных имён файлов с описаниями загруженных модулей (через двоеточие)
- _MODULESBEGINENV_ - имя файла, содержащего превоначальное состояние переменных окружения
- MODULERCFILE - имя глобального файла настроек
Команда module при каждом запуске просматривает файлы
с глобальными (${MODULERCFILE } или ${MODULESHOME }/etc/rc (сюда вписывать trace и log)),
личными (${HOME }/.modulerc ) и модулезависимыми (файлы .modulerc и .version,
встреченные во время поиска описания модуля) настройками. Обнаруженный файл
с настройками интерпретируется (выполняется) как описание загружаемого модуля.
Модули ищутся по имени в каталогах (рекурсивно), указанных в MODULEPATH
(список через двоеточие). Описанием модуля считается файл,
имеющий в начале магический заголовок.
Ключи команды module:
- --long (выдача подкоманд list и avail в подробном формате)
- --terse (выдача подкоманд list и avail в кратком формаье)
- --verbose (подробные сообщения об ошибках)
- --silent
- --icase (при поиске (apropos) не учитывать прописные/строчные)
- --userlvl {novice | expert | advanced}
- --force (загрузить/выгрузить все модули, от которых зависит этот модуль)
Подкоманды команды module:
- help [имя-модуля]
- {load | add} имя-модуля ... (загрузить модуль - внести соответствующие
изменения в переменные окружения)
- {unload | rm} имя-модуля ... (выгрузить модуль - вернуть переменные окружения
в состояние до загрузки модуля)
- {switch | swap} имя-исходного-модуля имя-нового-модуля (заменить настройки
переменных окружения для исходного модуля на настройки для нового модуля)
- {show | display} имя-модуля (вывести полное имя файла с описанием модуля
и безусловные команды изменения окружения, выполняемые при загрузке модуля)
- list (показать загруженные модули)
- avail [имя-каталога] (вывести список доступных модулей, группируются по каталогам,
указанным в MODULEPATH)
- use [--append] каталог ... (добавить имя каталога в начало (в конец) MODULEPATH)
- unuse каталог ...
- update (выгрузить все модули, восстановить окружение из ~/.modulesbeginenv,
загрузить модули обратно)
- clear (очистить список загруженных модулей, не меняя переменные окружения)
- purge (выгрузить все модули)
- whatis [имя-модуля] (вывести описательную информацию, заданную директивами module-whatis)
- {apropos | keyword} строка (поиск в информации, заданной директивами module-whatis)
Сгруппировать все модули для проектов в одно хранилище (.../modulefiles/projects),
в котором для каждого проекта будет модуль, задающий версии используемых САПР:
#%Module1.0
setenv PROJECT_HOME /share/projects/имя-проекта
setenv CADNAME1_DEFAULT 6.7
setenv CADNAME2_DEFAULT A-2008
Сгруппировать все модули для отдельных САПР в одно хранилище (.../modulefiles/tools),
в котором для каждого САПР будет отдельный каталог в соответствии с именем САПР.
В этом каталоге будет отдельный модуль для каждой версии и файл .version для определения версии по умолчанию
#%Module1.0
if [info exists env(CADNAME1_DEFAULT)] {
set ModulesVersion $env(CADNAME1_DEFAULT)
} else {
set ModulesVersion "5.2"
}
Создать хранилище для группировки САПР, часто используемого вместе (.../modulefiles/works),
в котором для каждого типа работы будет отдельный модуль:
#%Module1.0
module load САПР1 САПР2
Теперь для создания правильного окружения над определённым проектом достаточно выполнить
module load имя-проекта тип-работы
|
Bog BOS: Управление переменными окружения - Environment Modules
|
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru