如何自动解决Environment-Modules模块依赖问题?
问题描述
我有多个使用module load调用程序的SBATCH脚本。某次作业在SLURM队列等待18小时后,仅运行3秒就因module load执行失败终止——原因是IT部门修改了目标程序的依赖。查过Environment-Modules官方文档,没找到自动解决依赖的方案,我不想用固定程序版本的临时办法,希望通过解析module load的输出来自动确定并加载依赖。
以下是手动加载pharokka的完整过程:
$ module load pharokka error: pharokka requires module(s) < PHANOTATE/1.5.0 MMseqs2/13-45111 tRNAscan-SE/2.0.12 minced/0.4.2 aragorn/1.2.41 Mash dnaapler > to be loaded first Loading pharokka/1.7.5 ERROR: Module evaluation aborted
$ module load PHANOTATE/1.5.0 MMseqs2/13-45111 tRNAscan-SE/2.0.12 minced/0.4.2 aragorn/1.2.41 Mash dnaapler error: tRNAscan-SE requires module(s) < infernal > to be loaded first Loading tRNAscan-SE/2.0.12 ERROR: Module evaluation aborted
$ module load infernal $ module load PHANOTATE/1.5.0 MMseqs2/13-45111 tRNAscan-SE/2.0.12 minced/0.4.2 aragorn/1.2.41 Mash dnaapler error: minced requires module(s) < graalvm/ce-java11-20.0.0 > to be loaded first Loading minced/0.4.2 ERROR: Module evaluation aborted
$ module load graalvm/ce-java11-20.0.0 $ module load PHANOTATE/1.5.0 MMseqs2/13-45111 tRNAscan-SE/2.0.12 minced/0.4.2 aragorn/1.2.41 Mash dnaapler $ module load pharokka
请问如何用Bash脚本自动化这个加载流程?
补充信息
module --version输出:
Modules Release 4.4.0 (2019-11-17)
pharokka/1.7.5模块文件内容:
#%Module ######### set is_module_rm [module-info mode remove] #---- whatis 用于 module apropos 命令 module-whatis "设置 pharokka (1.7.5) 的运行环境" module-whatis "topic_0080" module-whatis "topic_3174" module-whatis "topic_0160" module-whatis "topic_0769" module-whatis "topic_0659" module-whatis "operation_3672" module-whatis "operation_3482" module-whatis "operation_0464" module-whatis "operation_0335" module-whatis "operation_0310" #---- 模块帮助信息 proc ModulesHelp { } { puts stderr "本模块文件定义了使用 pharokka 包(版本1.7.5)所需的环境" puts stderr "" puts stderr "pharokka 用于快速标准化注释噬菌体。" puts stderr "项目地址:https://github.com/gbouras13/pharokka" puts stderr "" puts stderr "警告:pharokka 需要先加载以下模块 < PHANOTATE/1.5.0 MMseqs2/13-45111 tRNAscan-SE/2.0.12 minced/0.4.2 aragorn/1.2.41 Mash dnaapler >。" puts stderr "" ## 列出包提供的命令 puts stderr "本包提供以下命令:" puts stderr "\tcreate_custom_hmm.py" puts stderr "\tinstall_databases.py" puts stderr "\tpharokka.py" puts stderr "\tpharokka_multiplotter.py" puts stderr "\tpharokka_plotter.py" puts stderr "\tpharokka_proteins.py" puts stderr "" } #---- 基于 AUTOLOADMODULE 环境变量的自动加载 hack if {[info exists env(AUTOLOADMODULE)]} { module load PHANOTATE/1.5.0 MMseqs2/13-45111 tRNAscan-SE/2.0.12 minced/0.4.2 aragorn/1.2.41 Mash dnaapler } #---- 检查前置模块 if { [ module-info mode load ] && ! ( [ is-loaded "PHANOTATE/1.5.0" ] && [ is-loaded "MMseqs2/13-45111" ] && [ is-loaded "tRNAscan-SE/2.0.12" ] && [ is-loaded "minced/0.4.2" ] && [ is-loaded "aragorn/1.2.41" ] && [ is-loaded "Mash" ] && [ is-loaded "dnaapler" ] )} { puts stderr "error: pharokka requires module(s) < PHANOTATE/1.5.0 MMseqs2/13-45111 tRNAscan-SE/2.0.12 minced/0.4.2 aragorn/1.2.41 Mash dnaapler > to be loaded first" exit } #---- 设置路径 prepend-path PATH /opt/.../pharokka/1.7.5/bin prepend-path PATH /opt/.../pharokka/1.7.5/scripts
解决方案
可以编写一个Bash函数,循环尝试加载目标模块,每次捕获错误输出并解析其中的依赖模块,先加载这些依赖,直到成功加载目标模块。以下是实现脚本:
auto_load_module() { local target="$1" local loaded=0 while [ $loaded -eq 0 ]; do # 尝试加载目标模块,捕获stderr输出 local output=$(module load "$target" 2>&1) if [ $? -eq 0 ]; then loaded=1 echo "成功加载模块: $target" return 0 fi # 解析错误信息中的依赖模块,匹配 "requires module(s) < ... >" 格式 local deps=$(echo "$output" | grep -oP 'requires module\(s\) < \K[^>]+') if [ -z "$deps" ]; then # 没有找到依赖信息,退出并报错 echo "加载模块 $target 失败,且无法解析依赖信息:" echo "$output" return 1 fi # 递归加载所有依赖模块 echo "正在加载依赖模块: $deps" for dep in $deps; do auto_load_module "$dep" if [ $? -ne 0 ]; then echo "加载依赖模块 $dep 失败" return 1 fi done done } # 使用示例:加载pharokka auto_load_module "pharokka"
脚本说明
- 循环尝试加载:每次尝试加载目标模块,若失败则解析错误信息中的依赖。
- 依赖解析:通过正则表达式提取错误信息中
< >包裹的依赖模块列表。 - 递归加载依赖:对每个依赖模块调用自身函数,确保所有嵌套依赖都被加载。
- 终止条件:当目标模块加载成功时退出循环,若无法解析依赖则报错终止。
注意事项
- 该脚本依赖
module命令的错误输出格式稳定,如果IT部门修改了错误提示格式,需要调整正则表达式。 - 确保脚本在支持Bash的环境中运行,且
module命令已正确初始化(比如通过source /etc/profile.d/modules.sh)。
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

