Crontab执行WRF模型shell脚本时metgrid.exe无法运行如何解决
WRF定时任务metgrid.exe无法启动问题排查与解决
核心原因
crontab执行环境与用户交互式终端环境存在差异,是该类问题的核心诱因,具体可分为以下几类:
- 工作目录不匹配:脚本中所有相对路径(
./xxx、ln -s的目标路径)都是基于手动执行时的工作目录,而crontab默认执行工作目录为当前用户家目录,会导致可执行文件、依赖表文件找不到。 - 环境变量缺失:crontab执行时不会自动加载用户
.bashrc、.bash_profile中的环境配置,WRF运行依赖的MPI、NetCDF、编译器运行库等路径没有写入LD_LIBRARY_PATH、PATH变量,metgrid.exe依赖的动态库比ungrib.exe更多,会出现前者无法启动、后者正常运行的情况。 - SHELL版本不匹配:脚本shebang声明为
#!/bin/bash,但crontab配置了SHELL=/bin/sh,部分语法特性不兼容可能导致执行中断。 - 脚本冗余逻辑问题:示例脚本第二行的
bash属于多余命令,会额外启动子shell执行后续操作,子shell不会继承父脚本的环境配置,进一步放大环境差异问题。
排查步骤
- 首先给定时任务添加全量日志输出,修改crontab任务配置为:
00 01 * * * /home/user/WRF/scripts/WRF_scripts.sh >> /home/user/wrf_cron_run.log 2>&1
运行一次定时任务后查看日志,可直接定位到metgrid.exe启动时报错的具体原因(比如找不到动态库、找不到METGRID.TBL、无执行权限等)。
- 在脚本开头添加环境变量和工作目录打印命令,对比crontab执行和手动执行的差异:
# 加在脚本最顶部 pwd > /tmp/cron_workdir.log env > /tmp/cron_env.log
手动执行脚本时也执行同样的命令输出到另一组文件,diff对比两组结果即可找到缺失的环境变量、错误的工作目录。
修复方案
- 删除冗余命令:删掉脚本第二行的
bash命令,避免不必要的子shell启动。 - 强制切换工作目录:在脚本所有执行逻辑前添加工作目录切换命令,路径改为你手动执行WRF时进入的运行目录:
cd /home/user/WRF/你的运行目录
- 显式加载环境变量:在切换工作目录后,添加WRF依赖的环境变量配置,建议直接把你手动运行WRF前配置的环境变量命令复制到脚本中,比如:
# 示例,按你实际的环境配置修改 source /opt/intel/oneapi/setvars.sh export NETCDF=/home/user/netcdf export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH export PATH=$PATH:/home/user/WRF/WPS
如果不想单独写,也可以直接加载用户的环境配置文件:source ~/.bashrc,注意如果.bashrc开头有[ -z "$PS1" ] && return这类非交互shell直接退出的判断,需要把这段判断删掉,或者把环境变量移到判断之前。
4. 修正crontab的SHELL配置:将crontab中的SHELL=/bin/sh改为SHELL=/bin/bash,和脚本声明的解释器保持一致。
5. 稳定软链配置:修改软链命令为绝对路径,加-f参数避免重复创建报错:
ln -sf /home/user/WRF/WPS/metgrid/METGRID.TBL.ARW /home/user/WRF/你的运行目录/METGRID.TBL
内容的提问来源于stack exchange,提问作者pmiranda
相关产品推荐
相关产品推荐

