Запуск сценария для события Slurm Preemption Suspend - PullRequest
0 голосов
/ 25 октября 2019

Я планирую использовать разные очереди с разными приоритетами, и работа в очереди с более высоким приоритетом должна приостановить работу в очереди с более низким приоритетом. Этот механизм работает отлично, за исключением того, что я хотел бы отловить событие приостановки и запустить несколько сценариев для выпуска лицензий на программное обеспечение.

Мне не удалось найти встроенный механизм для этого. Я посмотрел на перехват системных сигналов, отправляемых процессам. В руководстве говорится, что 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, это будетнет?

1 Ответ

0 голосов
/ 05 ноября 2019

Я обнаружил, что slurm использует морозильник для приостановки процессов при использовании ProctrackType=proctrack/cgroup.

Практически невозможно поймать какой-либо сигнал по замыслу. Таким образом, используя ProctrackType=proctrack/linuxproc сделал свое дело. Теперь я могу поймать SIGTSTP перед отправкой SIGSTOP.

Конечно, это не идеальное решение, если вам нужно использовать cgroups для отслеживания процессов.

...