Управление переменными окружения

Переменные окружения - именованные переменные в работающей сессии коммандной оболочки (например, bash), содержащие текстовые значения. Каждая сессия имет свой набор установленных переменных и их зачений. При завершении сессии значения переменных не сохраняются. С помощью указанных ниже переменных, например, настраиваются:

  • PATH - список директорий, в которых ищутся исполняемые файлы;
  • LIBRARY_PATH - список директорий, содержащих динамические библиотеки, необходимые компилятору для создания исполняемого файла из исходных текстов;
  • LD_LIBRARY_PATH - список директорий, содержащих динамические библиотеки, необходимые для работы программы;
  • MANPATH - список директорий, содержащих документацию в формате 'man';

Просмотреть значения всех установленных переменных можно утилитой 'env'. Значение определённой переменной можно узнать, напечатав его (например, выполнив 'echo $PATH').

Изменяя значения переменных окружения, можно работать с разными версиями определённого программного обеспечения. Например, в операционной системе SLES12 SP4 по умолчанию используется компилятор GCC 4.8.5, но после соответствующего изменения переменных окружения могут быть доступны более новые версии GCC - 6,7,8,9.

Для удобства управления переменными окружения используется утилита 'module'. Каждому приложению соответствует конфигурационный файл (модуль), описывающий, как необходимо изменить переменные окружения для работы данного приложения. Модуль может быть как загружен (необходимые значения добавляются к текущим переменным окружения), так и выгружен (настройки, соответствующие данному приложению, удаляются из переменных окружения). Возможно независимо управлять несколькими модулями, например, загрузить настройки для одновременной работы Tecplot и Mathematica. Некоторые комбинации, однако, бессмысленны - например, загрузка модулей для нескольких версий одного и того же приложения.

Если быть точным, существует несколько программ, предоставляющих утилиту 'module'. Более ранняя - Environment Modules, развивающаяся примерно с 1990 года. В связи с определёнными её недостатками позже другим коллективом была разработана программа Lmod, поддерживающая конфигурационные файлы Environment Modules и совместимая на уровне параметров командной строки. Ниже приведены полезные ссылки для обеих программ:

В нашем центре долгое время использовалась программа 'Environment Modules', но затем была произведена миграция на Lmod, поскольку эта программа используется для управления переменными окружения в SLES High-Performance Computing Module for SLES 12.

При использовании Midnight Commander учитывайте, что эта программа сохраняет текущие переменные окружения при запуске других программ (в частности, при выполнении module) и восстанавливает их после завершения. Поэтому для изменения переменных окружения необходимо предварительно выйти из mc.

Показать список

Список доступных модулей отображается следующей командой:

module avail

В результате будет выведено примерно следующее:

-------- /usr/share/lmod/modulefiles --------
   gnu/4.8    gnu/6    gnu/7    gnu/8    gnu/9 (D)

-------- /opt/shared/modules --------
   anaconda/anaconda2        ansys/hfss/12          gams/23.6.3     (D)    matlab/r2012a               nvidia/cuda-toolkit-5.5        rsoft/optsim5.3
   anaconda/anaconda3 (D)    ansys/hfss/13.0        gcc/4.3.4              matlab/r2012b               nvidia/cuda-toolkit-6.0        rsoft/8.3       (D)
   ansys/12.1.1              ansys/hfss/14.0        gcc/4.4.7              matlab/r2013a               nvidia/cuda-toolkit-7.5        tecplot/latest
   ansys/13.0                ansys/hfss/15.0 (D)    gcc/4.8.2       (D)    matlab/r2013b        (D)    nvidia/cuda-toolkit-8.0 (D)    tecplot/2013r1  (D)
   ansys/14.0                comsol/4.1             gmsh/2.5.0             microsoft-r/3.3             pgi/11.10
   ansys/18.0                comsol/4.2a            jdk/1.8.0              msc/marc/2015               pgi/13.09
   ansys/18.2                comsol/4.3a     (D)    jre/1.6.0              msc/nastran/r3.1            pgi/14.01
   ansys/19.1                cpmd/qmmm-2013         jre/1.8.0       (D)    msc/nastran/2010.1.3 (D)    pgi/14.04
   ansys/2019r3              gams/23.5.2            mathematica/8.0        nvidia/cuda-toolkit         pgi/14.10               (D)

  Where:
   D:  Default Module

Use "module spider" to find all possible modules.
Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys".

Модули, находящиеся в разделе '/usr/share/lmod/modulefiles', установлены в составе ПО, поставляемого с операционной системой. Модули из раздела '/opt/shared/modules' добавлены администрацией ИВЦ и соответствуют дополнительно установленному прикладному ПО.


Возможно выборочное отображение модулей. Например, чтобы показать только ПО matlab:

module avail matlab

Результат:

-------- /opt/shared/modules --------
   matlab/r2012a    matlab/r2012b    matlab/r2013a    matlab/r2013b (D)

  Where:
   D:  Default Module

Загрузить модуль

Загрузить модуль JRE версии 1.8.0:

module load jre/1.8.0

Проверить, какой файл 'java' будет использоваться:

cn120:~> which java
/opt/shared/java/jre1.8.0_45/bin/java

Отобразить загруженные

cn120:~> module list
Currently Loaded Modulefiles:
  1) jre/1.8.0

Выгрузить модуль

Удалить из переменных окружения информацию загруженного ранее модуля JRE:

module unload jre/1.8.0

Проверить:

cn120:~> module list
No modules loaded
cn120:~> which java
which: no java in (/sbin:/usr/sbin:usr/local/sbin: .... )

Собственные модули

Если необходимо использовать несколько фиксированных конфигураций переменных окружения (например, попеременно использовать несколько компиляторов), то задавать их значения через файл '~/.bashrc' неудобно. Вместо этого можно создать собственные модули и подключить их к утилите 'module'.

Пример:

  • Создайте директорию '~/modules'.
  • Создайте файл '~/modules/my-cuda' следующего содержания (формат описан на официальном сайте):
    #%Module -*- tcl -*-
    
    module-whatis   "Add my CUDA Toolkit to environment variables"
    
    prepend-path    PATH                    ~/cuda/bin
    prepend-path    CPATH                   ~/cuda/include
    prepend-path    LD_LIBRARY_PATH         ~/cuda/lib64:/lib
  • Чтобы утилита 'module' использовала файлы из директории '~/modules', выполните (эту команду как раз стоит добавить в '~/.bashrc'):
    export MODULEPATH=$MODULEPATH:~/modules