通过walltime杀死之前的批处理作业

时间:2014-11-07 13:18:12

标签: batch-processing slurm

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

2 个答案:

答案 0 :(得分:9)

--signal选项

的时间限制发生之前,您可以让Slurm在可配置的时间内发出工作信号

来自sbatch手册页:

  

- 信号= [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选项。如果您的版本没有它,您将需要设置看门狗。请参阅示例here

答案 1 :(得分: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 在作业结束前 10 分钟发送 SIGUSR1 信号时向它传播 $ conda remove plotly $ jupyter labextension uninstall jupyterlab-plotly $ jupyter labextension uninstall plotlywidget 信号,以便脚本可以捕获它,保存检查点并优雅退出.