【问题标题】:Conditional cron job using SLURM scheduler使用 SLURM 调度程序的条件 cron 作业
【发布时间】:2019-04-18 22:17:43
【问题描述】:

我目前正在使用 slurm 工作负载管理器的计算集群上运行作业。我可以查看我目前正在运行的所有作业:

$ squeue -u <username>
             JOBID PARTITION  NAME       USER ST     TIME  NODES NODELIST(REASON)
           3379570   sixhour job01 <username> PD     0:00      1 (Priority)
           3409269   sixhour job02 <username>  R 03:06:13      1 n387

所以在这个例子中,我有两个已提交的作业。 job01 待定,job02 已运行约 3 小时。

我想设置一个 cron 作业,如果它没有在上面的视图中列出,它只会提交作业。以如下 cron 文件为例:

MAILTO=""
* */1 * * * sbatch job01.sh
* */1 * * * sbatch job02.sh
* */1 * * * sbatch job03.sh

使用这个 cron 文件,每个作业都会每小时提交一次。但是因为job01job02 已经列在squeue -u &lt;username&gt; 下,我只希望job03 真正被提交。

有没有办法可以在 cron 文件中添加一些条件逻辑?

【问题讨论】:

  • 不要直接从cron 调用sbatch,而是创建一个脚本,在启动作业之前执行所需的检查并将其替换sbatch
  • 这里的目的是什么?要自动重新提交作业吗?
  • @damienfrancois 我的用例实际上是相反的。我有一个推特机器人设置为按设定的时间间隔运行。有时,根据计算集群的工作负载,我会在队列中堆积 5-6 个作业,一旦空间释放,这些作业最终都会同时运行。如果队列中已经有一个,这将防止额外的 tweet-bot 作业堆积在队列中。

标签: cron slurm


【解决方案1】:

你可以试试这样的脚本:

#!/bin/bash

jobnames=$(squeue -h --user <username> --format %j)

for jobname in job{01..03} ; do
grep "$jobname" <<< "$jobnames" >/dev/null || sbatch "$jobname.sh"
done

此脚本将收集与&lt;username&gt;$jobnames 中提交的作业相关的所有作业名称,然后迭代它应该期望的那些。如果没有找到,grep 将返回非零退出代码,|| sbatch 将被执行。

将 cron 文件中的三行替换为运行上述脚本的一行。

【讨论】:

  • 您也可以将 grep 行替换为 [[ $jobnames == *$jobname* ]] || sbatch "$jobname.sh"
猜你喜欢
  • 2010-11-19
  • 2013-12-19
  • 2013-02-01
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
相关资源
最近更新 更多