Скрипт Python: дождаться завершения задания в сессии tmux

Вопрос или проблема

Я пытаюсь постоянно запускать Python-скрипт с случайными параметрами из другого Python-скрипта, где каждый запуск происходит в отдельной сессии tmux. Очень упрощенный обзор того, что я пытаюсь сделать, таков:

# Python-скрипт для запуска других Python-скриптов
from subprocess import call
import random

while True:
    param = randint(1,100)
    runmyscript ="tmux send-keys -t mysession"+str(param)+" 'python myscript.py param' "
    call(runmyscript)
    #Подождите, пока myscript.py завершит выполнение в своей сессии tmux <-- Как это сделать?

Например, допустим, что случайные числа — это 57, 61, 88 … и т. д. Указанный выше скрипт должен запускать:

  • ‘myscript.py 57’ в сессии tmux под названием “mysession57”
  • ‘myscript.py 61’ в сессии tmux под названием “mysession61”
  • ‘myscript.py 88’ в сессии tmux под названием “mysession88”
    … и т. д.

Но как я могу убедиться, что скрипт ждет, пока каждый скрипт в своей сессии tmux завершится?

from subprocess import call
import random

while True:
    param = random.randint(1,100) #добавьте случайный первый или from random import randint
    runmyscript ="tmux send-keys -t mysession %s 'python myscript.py param' "%str(parma)
    call(runmyscript,shell=True)#нужно добавить условие или что-то, чтобы прервать цикл

Ответ или решение

Для решения задачи, связанной с ожиданием завершения выполнения скрипта Python в сессии tmux, необходимо доработать ваш текущий код. Мы будем использовать tmux для управления сессиями и subprocess для выполнения команд. В данном ответе я подробно расскажу о каждом уступе и предложу оптимизированный код.

Задача

Вам нужно запустить скрипт myscript.py с различными случайными параметрами в отдельных сессиях tmux и дождаться завершения выполнения каждого из этих скриптов до того, как перейти к следующему запуску. Это позволяет избежать ситуации, когда на одном из этапов запуска будут запущены сразу несколько экземпляров скрипта.

Шаги для реализации

  1. Создание tmux-сессий: Вам нужно убедиться, что для каждого параметра создается отдельная tmux-сессия.
  2. Отправка команды в tmux: Использовать команду send-keys для отправки команды на выполнение в соответствующую сессию.
  3. Ожидание завершения работы: Для ожидания завершения работы запущенного процесса нужно постоянно проверять статус каждой сессии.

Оптимизированный код

Вот пример кода, который реализует описанную логику:

import subprocess
import random
import time

def run_script(param):
    session_name = f"mysession{param}"

    # Создаем новую tmux-сессию, если ее еще нет
    subprocess.call(f"tmux new-session -d -s {session_name}", shell=True)

    # Отправляем команду запуска в созданную сессию
    run_command = f"python myscript.py {param}"
    subprocess.call(f"tmux send-keys -t {session_name} '{run_command}' Enter", shell=True)

    # Ожидаем завершения работы скрипта
    while True:
        # Проверяем, существует ли сессия
        result = subprocess.call(f"tmux has-session -t {session_name}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        if result != 0:  # Сессия завершена
            print(f"Скрипт с параметром {param} завершил работу.")
            break
        time.sleep(1)  # Ждем перед следующим опросом

while True:
    param = random.randint(1, 100)
    run_script(param)

Пояснения к коду

  1. Создание сессии: Используется команда tmux new-session -d -s {session_name} для создания новой сессии в фоновом режиме.
  2. Отправка команды: Команда запуска скрипта отправляется в ранее созданную сессию с помощью tmux send-keys.
  3. Ожидание завершения: Используем бесконечный цикл с проверкой существования сессии tmux has-session. Если сессия завершается (т.е. скрипт завершает свою работу), программа выводит сообщение и выходит из цикла.

Заключение

Этот подход обеспечивает контроль над запуском отдельных экземпляров скриптов и ожидание их завершения перед следующим запуском. Не забудьте правильно обрабатывать возможные ошибки, особенно в производственном коде, например, проверять, что сессия корректно создается. Как результат, вы получите гибкий и устойчивый инструмент для управления запусками со случайными параметрами в изолированных сессиях tmux.

Оцените материал
Добавить комментарий

Капча загружается...