我正在使用SLURM运行批处理作业。在作业文件中启动的进程是迭代的。每次迭代后,程序可以通过创建一个名为stop的文件来轻松终止。 我希望在距离作业被walltime限制杀死1小时之前自动发出这样的停止命令。
我正在使用SLURM运行批处理作业。在作业文件中启动的进程是迭代的。每次迭代后,程序可以通过创建一个名为stop的文件来轻松终止。 我希望在距离作业被walltime限制杀死1小时之前自动发出这样的停止命令。
使用--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
中。如果您的版本没有它,您需要设置一个看门狗。参见这里的示例。
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 分钟向其传播该信号,以便脚本可以捕获它,保存检查点并优雅地退出。
$action terminate
配置参数来实现这一点,该参数需要一个timeout
参数,可以设置为任何值,例如1小时。也就是说,如果超过了walltime,则会调用$action terminate
脚本,并在超过timeout
时以正常方式杀死和清理剩余的进程(如果有)。 - Dima Chubarov