SLURM任务sbatch提交失败但srun运行成功的原因排查求助
问题:sbatch提交SLURM任务失败,srun却能正常运行
有用户在集群提交任务时,遇到sbatch提交任务失败,但用srun直接运行却能成功的情况,错误信息如下:
Unable to init server: Could not connect: Connection refused (canavier_model_changes_no_plots.py:1589287): Gdk-CRITICAL **: 22:46:57.434: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed can't open DISPLAY
用户提供的SLURM脚本:
#SBATCH --job-name=networkmodel #SBATCH --nodes=1 #SBATCH --cpus-per-task=10 #SBATCH --mem-per-cpu=4G #SBATCH --time=00-00:05:00 python3 canavier_model_changes_no_plots.py
用户原本以为是代码中matplotlib绘图部分导致问题,但移除相关代码后任务依然失败。
原因分析
srun能成功是因为你在登录节点执行srun时,会话继承了当前的DISPLAY环境变量(比如通过X11转发连接集群),程序可以找到可用的显示服务;而sbatch提交的任务是在计算节点后台运行,计算节点没有图形界面环境,DISPLAY变量不存在或无效,程序尝试访问图形显示时就会报错。即使移除了matplotlib绘图代码,可能代码中还有其他依赖图形环境的模块(比如某些科学计算库、GUI相关组件)在初始化时会尝试连接显示。
解决办法
强制设置matplotlib为非交互式后端
在Python代码开头添加:import matplotlib matplotlib.use('Agg')或者在SLURM脚本的
python3命令前添加环境变量设置:export MPLBACKEND=Agg && python3 canavier_model_changes_no_plots.py清除DISPLAY变量
修改SLURM脚本,添加unset DISPLAY避免程序尝试连接无效的显示:#SBATCH --job-name=networkmodel #SBATCH --nodes=1 #SBATCH --cpus-per-task=10 #SBATCH --mem-per-cpu=4G #SBATCH --time=00-00:05:00 unset DISPLAY python3 canavier_model_changes_no_plots.py检查代码中的GUI依赖
排查代码中是否有tkinter、PyQt等GUI相关模块的导入或调用,这些模块在无图形环境的计算节点会触发报错,需要替换为非GUI实现或禁用相关逻辑。
内容的提问来源于stack exchange,提问作者hduece
相关产品推荐
相关产品推荐

