我有 200 多个工作需要提交到 sge 集群。我会将它们提交到两个问题中。其中一个问题有一台我不想提交作业的机器。我怎样才能排除那台机器?我发现唯一可能有用的是(假设 q1 可用的三个有效节点和 q2 的所有可用节点都是有效的):
qsub -q q1.q@n1 q1.q@n2 q1.q@n3 q2.q
我有 200 多个工作需要提交到 sge 集群。我会将它们提交到两个问题中。其中一个问题有一台我不想提交作业的机器。我怎样才能排除那台机器?我发现唯一可能有用的是(假设 q1 可用的三个有效节点和 q2 的所有可用节点都是有效的):
qsub -q q1.q@n1 q1.q@n2 q1.q@n3 q2.q
假设您不想在其上运行它称为 n4 然后将以下内容添加到您的脚本中应该可以工作。
#$ -l h=!n4
如果您将 -l 选项添加到 qsub 命令行而不是将其嵌入到提交的脚本中,大多数 shell 将需要引用感叹号。
我为此找到的最佳方法是在要允许执行的节点上设置自定义资源,然后在提交作业时需要该资源。
在 qmon 中,转到“复杂”配置并添加一个新属性。将名称设置为“my_allowed”之类的名称,将快捷方式设置为“m_a”之类的名称,将类型设置为 BOOL,将关系设置为 ==,requestable 设置为 Yes,consumable 设置为 No,然后“添加”它。提交对复杂配置的更改。
从命令行执行下一步可能更容易,但您也可以在 qmon 中执行此操作。您需要将您的消耗品添加到您将允许您的工作在其上运行的每个主机。在 qmon 中,你可以进入主机配置,选择执行主机,依次打开每个主机,点击 consumables/fixed attributes 选项卡,添加刚才配置的新复合体,值为“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 在它的标准输入上获取编辑命令列表,所以我们给它三个命令。第一个编辑带有 complex_values 的行以包含 my_test 值。第二个写出临时文件,第三个退出 ed。
完成此操作后,使用需要新综合体的限制选项提交您的作业:
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
将此作业提交到您希望排除的节点,直到它们完全占据它。
瞧,您的节点已排除。