我们知道,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
可读并可执行所有脚本