我计划使用具有不同优先级的不同队列,较高优先级队列上的作业应该挂起较低优先级队列中的作业。这个机制工作得很好,除了我想捕捉暂停事件并运行一些脚本来发布软件许可证。
我还没有找到任何内置的机制来做到这一点。我研究了捕获发送到进程的系统信号。它在手册中说 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 它不会?