我目前正在使用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文件,每个作业每小时都会提交一次。但是因为job01
和job02
已经在squeue -u <username>
下列出了,所以我只希望job03
真正被提交。
有什么方法可以向cron文件中添加一些条件逻辑吗?
答案 0 :(得分:2)
您可以尝试这样的脚本:
#!/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
此脚本将收集与<username>
在$jobnames
中提交的作业相关的所有作业名称,然后对其应有的名称进行迭代。如果找不到一个,grep
将返回非零退出代码,并且|| sbatch
将被执行。
用运行上述脚本的一行替换cron文件中的三行。