我在使用SLURM计划的HPC上运行一些C ++程序。有时,我的程序由于使用过多资源或运行时间过长而被终止。通常,如果我的程序完成运行或遇到内部错误,我会收到一条消息,告诉我该事实,我可以采取适当的措施。
但是,如果我的程序被队列管理器杀死,我将不会收到任何消息(是的,我指定我希望在作业文件中获得这些消息,但是以某种方式无法正常工作)。因此,我想知道是否有可能在遇到终止信号时在程序中调用函数,或者以其他方式告诉我主程序何时终止?
答案 0 :(得分:1)
也许您可以反过来看。在程序结束前将其停止一点,并尽责产生干净的出口。有了slurm,您可以使用:
#SBATCH --signal=B:USR1@120
在任务限制前120秒向您的bash脚本发送信号。只需捕获此信号并产生干净的出口即可。
我使用它,并且效果很好。
#!/bin/bash -l
# job name
#SBATCH --job-name=example
# replace this by your account
#SBATCH --account=...
# one core only
#SBATCH --ntasks=1
# we give this job 4 minutes
#SBATCH --time=0-00:04:00
# asks SLURM to send the USR1 signal 120 seconds before end of the time limit
#SBATCH --signal=B:USR1@120
# define the handler function
# note that this is not executed here, but rather
# when the associated signal is sent
your_cleanup_function()
{
echo "function your_cleanup_function called at $(date)"
# do whatever cleanup you want here
}
# call your_cleanup_function once we receive USR1 signal
trap 'your_cleanup_function' USR1
echo "starting calculation at $(date)"
# the calculation "computes" (in this case sleeps) for 1000 seconds
# but we asked slurm only for 240 seconds so it will not finish
# the "&" after the compute step and "wait" are important
sleep 1000 &
wait
这些行是从here提取的