首页 > 解决方案 > 如何将显示传递给 qsub 命令?

问题描述

我正在运行一个 bash 脚本,除其他外,它运行一个可通过 GUI 或命令行(取决于参数)使用的 java 程序。

splitstree --commandLineMode --commandFile comm.txt --version --verbose

编辑:

当我通过普通命令行或 GUI 运行它时,它运行良好。如果我echo将此命令放入一个文件中并且$(cat file)它也可以工作,并且当我将它集成到 bash 脚本并运行 bash 脚本时它也可以工作。

如果我qsub将它连接到我正在执行工作的集群,我会收到有关缺少显示的错误:

java.awt.HeadlessException: 
No X11 DISPLAY variable was set, but this program performed 
an operation which requires it.

我试图export DISPLAY=:0.0在 bash 脚本中,但错误没有改变。

编辑2:

如果我将 DISPLAY 变量传递给qsub命令,错误就会消失,但程序会以退出状态 1 终止。比如:

qsub -v DISPLAY <job_file>

它还说Picked up _JAVA_OPTIONS: -Xmx4096M,但unset对这个变量执行并没有改变退出状态(所以可能不会损害进程)。

在外部重新运行相同的命令qsub(即:只需将 cmd 复制粘贴到 shell 中)再次完美运行。

关于如何使qsub命令正确地将显示信息传递给集群节点的任何建议?

标签: javabashshellx11display

解决方案


如果您不需要显示,请使用-Djava.awt.headless=true属性运行 Java,如在 Java SE 平台中使用无头模式中所述

或者,如果您的程序无法无头运行,您可以尝试使用Xvfb (X virtual framebuffer)。它带有xvfb-run命令,看看Running without a Display wiki:

xvfb-run java MainClass

或通过配置DISPLAY环境变量:

sudo Xvfb :1 -screen 0 1024x768x24 </dev/null &
export DISPLAY=":1"
java MainClass

推荐阅读