我有200多个工作需要提交到sge集群。我将把它们分为两个问题。其中一位专家有一个我不想向其提交作业的机器。如何排除那台机器?我发现唯一有用的是(假设三个可用于q1的有效节点,而所有可用于q2的节点均有效):
qsub -q q1.q@n1 q1.q@n2 q1.q@n3 q2.q
假设您不想在其上运行它,则称为n4在脚本中添加以下内容应该可以。
#$ -l h=!n4
我为此找到的最好方法是在要允许执行执行的节点上设置自定义资源,然后在提交作业时要求该资源。
在qmon中,转到“复杂”配置并添加新属性。将名称设置为“ my_allowed”,将快捷方式设置为“ m_a”,将类型设置为BOOL,将其与==关联,将其设置为Yes,将其设置为No,然后将其“添加”。提交对复杂配置的更改。
下一步可能更容易从命令行执行,但是您也可以在qmon中执行。您需要将消耗品添加到要允许其运行作业的每个主机上。在qmon中,您可以转到主机配置,选择执行主机,然后依次打开每个主机,单击“消耗品/固定属性”选项卡,并添加您刚刚在上面配置的新复合物,其值为“ True”。从命令行,您可以使用“ qconf -sel”获取执行主机的列表。此列表适用于传递到循环并删除您不希望包含的主机。做这样的事情:
qconf -sel | grep -v host_to_exclude | while read host; do
EDITOR="ed" qconf -me $h <<EOL
/complex_values/s/$/,my_test=True/
w
q
EOL
done
这可让您以编程方式编辑主机(qconf通常不允许,因为它想为您启动编辑器)。它通过将编辑器设置为“ ed”来完成此操作(您必须确保已安装ed编辑器...尝试首先手动运行它...键入“ q”退出)。 ed在其stdin上获取了编辑命令列表,因此我们给它提供了三个命令。第一个编辑带有complex_values的行以包含my_test值。第二个写出临时文件,第三个退出。
完成此操作后,使用限制选项提交作业,该限制要求您使用新的综合系统:
qsub -q whatever -l my_test=True my_prog.sh
-l选项设置一个限制,而my_test = True表示该作业只能在具有复杂的my_test且值为True的主机上运行。由于该组合物不是消耗性的,因此它仍可以在每个主机上运行所需的任意数量的作业(不超过主机的插槽限制),但是它将避免将my_test组合物未设置为True的任何主机。
对此有一个很好的绕过。
生成一个简单的bash文件:
#!/bin/bash
sleep 6000 #replace 6000 with any long period of time that will be enough to submit your jobs
将此作业提交到您要排除的节点,直到它们完全占据它为止。
Voila,您的节点已排除。