Я планирую использовать разные очереди с разными приоритетами, и работа в очереди с более высоким приоритетом должна приостановить работу в очереди с более низким приоритетом. Этот механизм работает отлично, за исключением того, что я хотел бы отловить событие приостановки и запустить несколько сценариев для выпуска лицензий на программное обеспечение.
Мне не удалось найти встроенный механизм для этого. Я посмотрел на перехват системных сигналов, отправляемых процессам. В руководстве говорится, что SIGSTOP и SIGCONT используются для приостановки и возобновления процессов. Однако невозможно поймать эти сигналы.
Я сделал фиктивный скрипт на python, чтобы посмотреть, как он работает, и похоже, что slurm отправляет SIGSTP прямо перед SIGSTOP, если вы используете srun в пакетном скрипте, в противном случае я не могу поймать какие-либо сигналы.
вот сценарии 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
Итак, вопросы:
- Есть ли лучший способ сделать это, не пытаясь перехватить системные сигналы?
- Почему он отправляет SIGTSTP (перехватывается) перед SIGSTOP (не перехватывается), когда я использую srun vs без srun, это будетнет?