我有一个perl脚本,它准备文件以输入二进制程序,并将二进制程序的执行提交给SGE排队系统版本6.2u2。
使用-sync y
选项提交作业,以允许父perl脚本使用waitpid函数监视已提交作业的状态。
这也非常有用,因为将SIGTERM发送到父perl脚本会将此信号传播给每个子节点,然后将这些信号转发到qsub,从而优雅地终止所有关联的提交作业。
因此,能够使用-sync y
选项提交作业非常重要。
不幸的是,我一直收到以下错误:
Unable to initialize environment because of error: range_list containes no elements
注意'容器'的拼写错误。那是不一个错字。它只是向您显示代码/错误消息的这个区域必须维护得很差。
产生此错误的尝试提交甚至无法生成STDOUT和STDERR文件*.e{JOBID}
和*.o{JOBID}
。提交完全失败。
在Google上搜索此错误消息只会导致在不明显的留言板上发布未解决的帖子。
此错误甚至无法可靠地发生。我可以重新运行我的脚本,相同的工作甚至不一定会产生错误。我尝试提交作业的节点似乎也无关紧要。
我希望有人可以解决这个问题。
任何这些问题的答案都可以解决我的问题:
答案 0 :(得分:9)
我们的网站在SGE 6.2u5中遇到了这个问题。我在邮件列表上发布了一些问题,但没有解决方案。到现在为止。
事实证明错误信息是假的。我通过阅读Univa github“open-core”repo上的更改日志来发现这一点。我后来看到了Son of Gridengine v8.0.0c发行说明中提到的问题。
以下是github repo中的相关提交:
错误消息 应该说的是您已达到系统中qsub sync -y
个作业数量的限制。此参数称为MAX_DYN_EC
。我们版本中的默认值为99,上面的更改将默认值设置为1000。
MAX_DYN_EC
的定义(来自sge_conf(5)手册页)是:
设置动态事件客户端的最大数量(由qsub -sync使用) y和Grid Engine DRMAA API库会话)。默认设置 到99.动态事件客户端的数量不应该更大 超过系统具有的文件描述符数量的一半。数字 文件描述符的共享在所有exec的连接之间共享 主机,所有事件客户端和qmaster需要的文件句柄。
您可以使用以下命令检查有多少动态事件客户端:
$ qconf -secl | grep qsub | wc -l
我们已通过MAX_DYN_EC=1000
将qmaster_params
添加到qconf -mconf
。我已经测试了提交数百个qsub -sync y
个作业,我们不再遇到range_list错误。在MAX_DYN_EC
更改之前,这样做会可靠地触发错误。
答案 1 :(得分:0)
我找到了解决这个问题的方法 - 或者至少是一种解决方法。
我的目标是让qsub
的个别实例保持在前台,因为它提交的作业仍然在队列中或正在运行。这是通过-sync
选项实现的,但导致了我在我的问题中描述的可怕的不可预测的错误。
此问题的解决方案是使用带有qrsh
选项的now -n
命令。这导致作业的行为类似于qsub -sync
,因为我的脚本可以通过在qrsh实例上使用waitpid
隐式监视提交的作业是否正在运行。
此解决方案的唯一警告是,您正在操作的队列不得在交互节点(由qrsh
提供)和非交互节点(可由qsub
访问)之间进行任何区分。如果存在区别(可能交互节点少于非交互节点),则此解决方法可能无济于事。
然而,由于我没有发现任何与qsub -sync
问题的解决方案相近的任何问题,这个问题在任何地方都是如此的功能,让这篇文章通过互联网传播给任何在我类似情况中遇到的任性的灵魂。< / p>