我们知道,SLURM可以在作业完成后发送电子邮件。

除此之外,类似于作业完成时的邮寄机制:

[Q]完成任何作业后,SLURM能否触发脚本(由frontend-SLURM用户实现)?

解决方案示例:这将迫使我需要while()检查并等待提交的作业完成。这可能会占用更多的CPU使用率。

jobID=$(sbatch -U user -N1 run.sh | cut -d " " -f4-);
job_state=$(sacct -j $jobID --format=state  | tail -n1 | head -n1)
while [ $job_state != $completed ]
do
    job_state=$(sacct -j $jobID --format=state  | tail -n1 | head -n1)
done
my_script.sh//When any job completed I want SLURM to trigger my_script.sh if possible.

请注意:有人告诉我,每隔1秒钟检查一次可能会效率低下。 Is doing `while ps -p $PID; do sleep 1; ` until a script is completed efficient?

感谢您的宝贵时间和帮助。

最佳答案

一个选项是(ab)使用MailProg中的slurm.conf选项。最初,它是用来在作业完成后向用户发送电子邮件的程序的完全限定路径。但是该程序可以执行其他任何操作。它通过命令行参数接收作业ID和其他信息。

因此,您可以使用MailProg=/path/to/my_script.sh配置slurm。而且,您需要确保客户端添加了--mail-type选项,或者它是通过作业提交插件自动添加的。

该脚本可以具有以下结构(未经测试):

#!/bin/bash

# First to the wanted behaviour
jobid=$(echo $2 | cut -d= -f2 | cut -d' ' -f 1|cut -d_ -f1)
event=$(echo $2 | awk 'print $4')

case $event in
Started)
    job_startup_script $jobid
    ;;
Ended|Failed|TIMEOUT)
    job_end_script $jobid
    ;;
esac

# Then send the email to get the usual behaviour
/bin/mail "$@"

该脚本将从Slurm参数接收如下所示:
SLURM Job_id=<Job-ID> Name=<JobName> <Status>, Run time <RunTime>

如果脚本job_startup_script太长,请以nohup开头,并使用&号(&)使其成为后台进程。

还请确保SlurmUser可读并可执行所有脚本

10-08 02:29