在walltime之前结束批处理作业,避免kill。

7

我正在使用SLURM运行批处理作业。在作业文件中启动的进程是迭代的。每次迭代后,程序可以通过创建一个名为stop的文件来轻松终止。 我希望在距离作业被walltime限制杀死1小时之前自动发出这样的停止命令。


实际上,您想要拥有一个自定义的终止脚本。在PBS Pro中,可以通过$action terminate配置参数来实现这一点,该参数需要一个timeout参数,可以设置为任何值,例如1小时。也就是说,如果超过了walltime,则会调用$action terminate脚本,并在超过timeout时以正常方式杀死和清理剩余的进程(如果有)。 - Dima Chubarov
2个回答

12

使用--signal选项,您可以在时间限制之前的可配置时间内向Slurm发出信号,以使作业做出响应。

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文件。

请注意,只有最近版本的Slurm具有B:选项在--signal中。如果您的版本没有它,您需要设置一个看门狗。参见这里的示例。


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,并在 slurm 发送信号 SIGUSR1 前 10 分钟向其传播该信号,以便脚本可以捕获它,保存检查点并优雅地退出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接