用Modules管理環境變量
官網鏈接:http://modules.sourceforge.net/
官方文檔:https://modules.readthedocs.io/en/latest/
一、什么是Modules
通常,用戶在登錄時通過為他們將在會話期間引用的每個應用程序設置環境信息來初始化他們的環境。Environment Modules 包是一個簡化 shell 初始化的工具,讓用戶在使用模塊文件的會話期間輕松修改他們的環境。
每個模塊文件都包含為應用程序配置 shell 所需的信息。一旦 Modules 包被初始化,就可以使用解釋模塊文件的 module 命令在每個模塊的基礎上修改環境。通常,模塊文件指示模塊命令更改或設置 shell 環境變量,例如 PATH、MANPATH 等。模塊文件可能由系統上的許多用戶共享,並且用戶可能有自己的集合來補充或替換共享的模塊文件。
模塊可以以干凈的方式動態和原子地加載和卸載。支持所有流行的 shell,包括 bash、ksh、zsh、sh、 csh、tcsh、fish,以及一些腳本語言,如perl、ruby、tcl、python、 cmake和R。
模塊可用於管理不同版本的應用程序。模塊也可以捆綁到元模塊中,這些元模塊將加載一整套不同的應用程序。
大部分Linux用戶管理環境變量的方式都是,export PATH=/path/to/some/bin:/$PATH >> ~/.bashrc
,長期以往,當你echo $PATH
時就會發現出現了大量的軟件路徑,在我眼里,降低系統對工具的搜索速度是其次的,主要是不太好看。而Module則是由管理員將不同軟件的環境配置寫好,然后用戶在登陸之后,只需要用module load xxx
在環境增加自己所需的工具即可。
二、安裝配置
1、先安裝tlc
yum install tcl-devel tk-devel
2、安裝
-
下載源碼文件編譯
下載鏈接: https://sourceforge.net/projects/modules/ tar -zxvf modules-4.7.1.tar.gz
cd modules-4.7.1 ./configure --prefix=/usr/local/Modules make make install
-
在線安裝
# 默認安裝版本為3.2.10 yum install environment-modules
3、初始化配置
為了保證用戶在登錄服務器的時候,能夠調用module,你得現將module的初始化腳本復制到/etc/profiled.d
目錄下
PREFIX一般情況下是/usr/local/Modules
cp PREFIX/init/profile.sh /etc/profile.d/modules.sh
cp PREFIX/init/profile.csh /etc/profile.d/modules.csh
或手動執行
source PREFIX/init/profile.sh
三、基本使用
module avail # 顯示可以使用的模塊
module list # 顯示已經加載的模塊
module load/add <module_name> # 加載模塊
module unload/rm <module_name> # 卸載模塊
module switch <module1_name> <module2_name> # 從module1切換到module2
Module工具依托於MODULEPATH
這個環境變量來查找配置信息目錄,也就是說你在設置好目錄結構,配置好環境變量后,只需要設置這一個module的環境變量,那么module工具就會自動去查找這個路徑下的所有配置信息。
up@up-vpc:~$ export | grep MODULEPATH
declare -x MODULEPATH="/usr/local/Modules/modulefiles"
declare -x MODULEPATH_modshare="/usr/local/Modules/modulefiles:1"
up@up-vpc:~$ ls /usr/local/Modules/modulefiles/
dot module-git module-info modules null use.own
# 在modulefiles目錄下存在幾個默認的modulefile
四、Modulefile
1、介紹
這里MODULEPATH
使用默認路徑,即/usr/local/Modules/modulefiles
。通常我們會將同一類的軟件、庫等內容放在同一個目錄,假設目錄名為modulefiles
,在modulefiles目錄下包含gcc、python、java等常用工具,而gcc又包含4.9.3、5.5.0兩個版本,python包含2.7、3.7兩個版本、java包含1.5、1.8兩個版本,那么它的目錄結構如下:
最后面的一版本號命令的文件為modulefile,我們只需要安裝這種目錄格式創建目錄和文件即可。
2、示例
#1、在文件開頭一定要寫上
#%Module1.0
這個是識別這個文件為modulefile的,沒有他這個文件不會被識別
#2、prepend-path要修改的環境變量 路徑
prepend-path PATH /soft/gcc/4.8.4/bin
#這個命令會把工具路徑添加到環境變量的前面
#3、setenv 環境變量名 值
setenv GCC_HOME /soft/gcc/4.8.4/
#這個命令會把你需要的環境變量配置到系統中
#%Module1.0
setenv GCC_HOME /software/gcc/4.8.4/
prepend-path PATH /software/gcc/4.8.4/bin
3、modulefile語法
文檔:https://modules.readthedocs.io/en/latest/modulefile.html#description
-
chdir
修改工作目錄chdir directory
-
prepend-path
將值附加或預先添加到環境變量prepend-path [-d C|--delim C|--delim=C] [--duplicates] variable value... # 例如: prepend-path PATH /usr/local/soft/bin
--delim c
可以重置分隔符,默認使用:
作為分隔符,例如PATH=directory:directory:directory
--duplicates
設置可重復定義,默認情況是已定義則不可重復定義
-
setenv
設置環境變量setenv variable value # 例如: setenv CUS_VARIABLE 123
-
module-whatis
定義在調用命令時顯示的字符串該字符串參數必須用雙引號
module-whatis string # 例如:module-whatis "sysC version 2.3.1"
-
system
通過 shell運行字符串命令在 Unix 上,命令被傳遞給
/bin/sh
shell,而在 Windows 上,它被傳遞給cmd.exe
。modulecmd.tcl
將 stdout 重定向到 stderr,因為 stdout 將被評估 shell 解析。返回執行命令的退出狀態。system string
五、MODULEPATH
如三中所說,MODULEPATH
用於查找配置信息目錄,它也可以設置為多個路徑
- 注意:在所有MODULEPATH的路徑下絕對不能出現軟件名和版本一樣的modulefile
export MODULEPATH=/usr/share/Modules/modulefiles:/etc/modulefiles:/soft:/soft1:/soft2
六、設置默認版本
在 module avail 中,我們可以設置默認版本,例如我想將 gcc 4.9.3 設置為默認版本,當我 module load gcc
的時候,無需在后面寫/4.9.3
,就直接載入 4.9.3 版本,我們可以使用.version
文件來控制這個默認信息。在 modulefile 同級目錄下創建.version
文件
#%Module1.0
set ModulesVersion "4.9.3"
ls /soft/gcc
# 4.8.4 4.9.3 4.9.7
-
使用
module avail
查看,發現在4.9.3版本之后多了default