我正在使用SLURM运行批处理作业。我在作业文件中开始的过程是迭代的。在每次迭代之后,可以通过创建名为stop的文件轻轻地杀死程序。 我希望在工作被限制前一小时以自动方式发出这样一个停止命令。
答案 0 :(得分:9)
在--signal
选项
来自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
信号,以便脚本可以捕获它,保存检查点并优雅退出.