Вопрос или проблема
Я пытаюсь постоянно запускать 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 и дождаться завершения выполнения каждого из этих скриптов до того, как перейти к следующему запуску. Это позволяет избежать ситуации, когда на одном из этапов запуска будут запущены сразу несколько экземпляров скрипта.
Шаги для реализации
- Создание tmux-сессий: Вам нужно убедиться, что для каждого параметра создается отдельная tmux-сессия.
- Отправка команды в tmux: Использовать команду
send-keys
для отправки команды на выполнение в соответствующую сессию. - Ожидание завершения работы: Для ожидания завершения работы запущенного процесса нужно постоянно проверять статус каждой сессии.
Оптимизированный код
Вот пример кода, который реализует описанную логику:
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)
Пояснения к коду
- Создание сессии: Используется команда
tmux new-session -d -s {session_name}
для создания новой сессии в фоновом режиме. - Отправка команды: Команда запуска скрипта отправляется в ранее созданную сессию с помощью
tmux send-keys
. - Ожидание завершения: Используем бесконечный цикл с проверкой существования сессии
tmux has-session
. Если сессия завершается (т.е. скрипт завершает свою работу), программа выводит сообщение и выходит из цикла.
Заключение
Этот подход обеспечивает контроль над запуском отдельных экземпляров скриптов и ожидание их завершения перед следующим запуском. Не забудьте правильно обрабатывать возможные ошибки, особенно в производственном коде, например, проверять, что сессия корректно создается. Как результат, вы получите гибкий и устойчивый инструмент для управления запусками со случайными параметрами в изолированных сессиях tmux.