- Takeru製品では、1,2年前からプリインストールされたアプリケーションのPATHなどの環境変数の設定を.bashrcではなくEnvironment Modulesを使って行うようにしています。
- 背景としてはいくつかの要因がありますが、.bashrcのファイルでexportされている環境変数が多すぎてわかりにくくなっていることや、複数のバージョンの切り替えが容易になるといったメリットがあって導入しました。
- もちろん、従来通りに.bashrcなどのファイルに設定することはできますので、システムとしては環境変数に関する設定の選択肢が一つ増えたということになります。
- 今回はEnvironment Modulesの使い方について紹介します。
基本的な使い方
- 既にあるモジュールを利用する場合は下記の6つのコマンドでほとんどのケースをカバーできるはずです。
-
# module avail
: 利用可能なモジュールの一覧を表示
-
# module load [module]
: モジュールをロード = 環境変数をロード
-
# module list
: ロードされているモジュールを表示
-
# module unload [module]
: 指定したモジュールをアンロード
-
# module purge
: ロードされているモジュールを全てアンロード
-
# module show [module]
: 指定したモジュールの設定ファイルを表示
実行例
- "# module avail" : これを実行すると以下のように出力されます。
- $MODULEPATH で指定されたPATH以下の設定ファイルが読み込まれて表示されます。
- 複数バージョンを登録することができ、特定のバージョンをデフォルトとして登録することができます。
- デフォルトで登録された場合、スラッシュ(/)以下のバージョンを明示的に指定しなくてもデフォルトのバージョンがロードされます。
$ module avail
------------- /etc/modulefiles -------------
abyss/2.0.2(default)
allpathslg/52488(default)
bedtools2/2.26.0
bedtools2/2.27.1(default)
bioperl/1.7.1(default)
biopython/1.69
biopython/1.70(default)
bioruby/1.5.1(default)
...
...
$ which bedtools
/usr/bin/which: no bedtools in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)
$ module load bedtools2 # バージョン指定無しでロードした場合、デフォルトのバージョンがロードされる
$ module list
Currently Loaded Modulefiles:
1) bedtools2/2.27.1
$ which bedtools
/usr/local/bedtools2-2.27.1/bin/bedtools
$ module list
Currently Loaded Modulefiles:
1) bedtools2/2.27.1
$ module load bedtools2/2.26.0 # バージョンを明示してロード
$ module list
Currently Loaded Modulefiles:
1) bedtools2/2.27.1 2) bedtools2/2.26.0
$ which bedtools
/usr/local/bedtools2-2.26.0/bin/bedtools
$ echo $PATH # 下記のようにPATHに追加されていることがわかります。
/usr/local/bedtools2-2.26.0/bin:/usr/local/bedtools2-2.27.1/bin:.... 以下省略
$ module purge # 全てアンロード
$ module list
No Modulefiles Currently Loaded.
modulefileの記載方法
/etc/modulefiles以下にアプリケーション名のディレクトリを作成、その下にバージョン名のついたファイルを作成しています
- 例1) tophat2/2.1.1
- 1行目は
#%Module1.0
から始めます
- 2行目以降にPATHの設定を記載します。
- prepend-path の場合は、環境変数を冒頭に追加します。
- append-path の場合は、環境変数を末尾に追加します。
$ cat /etc/modulefiles/tophat2/2.1.1
#%Module1.0
prepend-path PATH /usr/local/bowtie-1.1.2
prepend-path PATH /usr/local/tophat2-2.1.1/bin
- 例2) R/3.4.0
- PATHだけでなく、下記のようなLD_LIBRARY_PATHの他、MANPATH, CPATH, CMAKE_PREFIX_PATHなど基本的にどんな環境変数でも宣言できます。
$ cat /etc/modulefiles/R/3.4.0
#%Module1.0
prepend-path PATH /usr/local/R-3.4.0/bin
prepend-path LD_LIBRARY_PATH /usr/local/R-3.4.0/lib64
- 例3) scypy/1.0.0
- modulefiles内で他のmoduleのロードも可能です。
$ cat /etc/modulefiles/scipy/1.0.0
#%Module1.0
module load numpy/1.13.3
prepend-path PYTHONPATH /usr/local/scipy-1.0.0/lib64/python2.7/site-packages
デフォルトバージョンの指定方法
- modulefiles以下のディレクトリ内に.versionというファイル内でデフォルトバージョンを指定します。
$ ls /etc/modulefiles/bedtools2/ -a
. .. 2.26.0 2.27.1 .version
$ cat /etc/modulefiles/bedtools2/.version
#%Module1.0
set ModulesVersion "2.27.1"
$ module avail bedtools # 以下のように2.27.1がデフォルトに設定されます。
------------- /etc/modulefiles -------------
bedtools2/2.26.0
bedtools2/2.27.1(default)
shell scriptに記載する際に注意
- module loadは、シェルスクリプトやGrid Engineへの投入スクリプト内でも使用することができます.
- ただ、moduleという実行バイナリがあるわけではなくaliasのため
module: command not found
とエラーが出ることがあります。
- そのような場合は、スクリプトの一行目のshebangに "#!/bin/bash -i" というように-i オプションを追加すると実行できるようになります。
#!/bin/bash -i
module load bowtie2
bowtie2 -x genomes/NC_008253 e_coli_1000.fq -S testout.sam
module unload bowtie2