1

我计划使用具有不同优先级的不同队列,较高优先级队列上的作业应该挂起较低优先级队列中的作业。这个机制工作得很好,除了我想捕捉暂停事件并运行一些脚本来发布软件许可证。

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

我制作了一个虚拟 python 脚本来观察它是如何工作的,如果您在批处理脚本中使用 srun ,它看起来就像 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)

用 sbatch 提交的 Bash 脚本

#!/bin/bash

./signal_trial

所以问题是:

  • 有没有更好的方法来做到这一点而不试图捕捉系统信号?
  • 为什么当我使用 srun 时它会在 SIGSTOP(uncatchable) 之前发送 SIGTSTP(catchable) 而没有 srun 它不会?
4

1 回答 1

1

我发现 slurm 在您使用ProctrackType=proctrack/cgroup.

通过设计来捕捉任何信号几乎是不可能的。所以使用ProctrackType=proctrack/linuxproc成功了。现在我可以在发送 SIGSTOP 之前捕获 SIGTSTP。

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

于 2019-11-05T07:14:05.937 回答