运行 Slurm 抢占暂停事件脚本

Running a script on Slurm Preemption Suspend Event

我打算使用具有不同优先级的不同队列,较高优先级队列中的作业应该挂起较低优先级队列中的作业。这种机制工作正常,除了我想捕捉暂停事件和 运行 一些脚本来发布软件许可证。

我还没有找到任何内置机制来执行此操作。我研究了捕获发送到进程的系统信号。它在手册中说 SIGSTOP 和 SIGCONT 用于挂起和恢复进程。然而,不可能捕捉到这些信号。

我制作了一个虚拟 python 脚本来观察它是如何工作的,如果你在批处理脚本中使用 s运行 ,看起来 slurm 在 SIGSTOP 之前发送 SIGSTP 否则我无法捕捉到任何信号。

这是我分别使用的 python 和 sbatch 脚本:

#!/usr/bin/env python3
import time
import signal
import os

if __name__ == "__main__":

    def signal_handler_suspend(*args):
        print("Suspended")

    def signal_handler_resume(*args):
        print("Continued")

    signal.signal(signal.SIGTSTP, signal_handler_suspend)
    signal.signal(signal.SIGCONT, signal_handler_resume)
    print(os.getpid())
    i=0
    while i<100:
        time.sleep(1)
        i+=1
        print(i)

Bash 与 sbatch 一起提交的脚本

#!/bin/bash

./signal_trial

所以问题是:

我发现当您使用 ProctrackType=proctrack/cgroup 时,slurm 使用 freezer 来暂停进程。

实际上不可能通过设计捕捉到任何信号。 所以使用 ProctrackType=proctrack/linuxproc 就可以了。现在我可以在发送 SIGSTOP 之前捕获 SIGTSTP。

如果您必须使用 cgroups 进行进程跟踪,这当然不是完美的解决方案。