7

I am running a batch job with SLURM. The process I start in the jobfile is iterative. After each iteration, the program can be killed softly by creating a file called stop. I would like such a stop command to be issued authomatically one hour before the job is killed via the walltime limit.

4

2 回答 2

12

您可以让 Slurm 在时间限制发生之前通过该--signal选项向您的工作发出可配置的时间

sbatch手册页:

--signal=[B:][@] 当作业在其结束时间的 sig_time 秒内时,向其发送信号 sig_num。由于 SLURM 对事件处理的解析,信号可能会比指定的提前 60 秒发送。sig_num 可以是信号编号或名称(例如“10”或“USR1”)。sig_time 必须具有介于 0 和 65535 之间的整数值。默认情况下,在作业结束时间之前不发送任何信号。如果指定 sig_num 而没有任何 sig_time,则默认时间为 60 秒。使用“B:”选项仅向批处理 shell 发出信号,不会向其他进程发出信号。默认情况下,所有作业步骤都会发出信号,但批处理 shell 本身不会发出信号。

如果您可以修改您的程序以捕获该信号以停止而不是查找文件,那么这是最佳选择。

如果不能,请添加类似

trap  "touch ./stop"  SIGUSR1

在您的提交脚本中。这--signal=B:SIGUSR1@3600将使脚本捕获SIGUSR1信号并stop在分配结束前一小时创建文件。

请注意,只有最新版本的 SlurmB:--signal. 如果您的版本没有,则需要设置看门狗。请参阅此处的示例。

于 2014-11-08T21:13:37.080 回答
0

添加 damienfrancois 的答案,应该注意的是,如果批处理脚本启动另一个阻塞进程,信号将不会传播给它。该进程应该在后台启动,然后等待,即:

SBATCH --signal=B:USR1@600

trap "echo Signal USR1 received!; kill -s SIGUSR1 ${PID}; wait ${PID}" USR1
my_script &    # launch my_script as a background job
PID=$!         # get the PID of the background job
wait ${PID}    # wait for the background job to finish

这将my_script在后台启动并SIGUSR1在 slurm 在作业结束前 10 分钟发送信号时将信号传播给它,以便脚本可以捕获它,保存检查点并优雅地退出。

于 2021-06-21T07:09:45.720 回答