java - 如何将显示传递给 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
命令正确地将显示信息传递给集群节点的任何建议?
解决方案
如果您不需要显示,请使用-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
推荐阅读
- javascript - 如何从html文件中提取特定标题下的所有文本
- .net - 在 Dot net 错误页面和 IIS 错误页面中隐藏路径信息
- javascript - 在 d3.js 中的树图中显示节点内的文本
- ios - 为什么 SwiftUI 初始化程序调用不同?
- c++ - 如何从字符串 C++ 中读取多个整数
- css - React JS:如何根据另一个元素的className bgcolor样式更改一组div中div的bgcolor
- mysql-workbench - “刷新记录集”命令给出错误“有待处理的更改。请先提交或回滚。”
- spring-boot - 在 activiti bpmn 工作流中使用带有 TimerCatchingEvents 的 ServiceTasks 行为不一致
- kubernetes - Kubernetes集群默认时区?
- android - 使用 sqlite 数据库从随机字符创建单词