Раскручивание нескольких сессий tmux в bash - PullRequest
0 голосов
/ 18 октября 2019

У меня есть скрипт Python, my_python_script, который принимает дату ввода. У меня есть сценарий bash, который вызывает этот сценарий Python для ряда дат внутри цикла for. Я попытался создать именованный сеанс в цикле for, но он вложил сеансы tmux:

call_runner_date_range() {
    start=$1
    end=$2

    start=$(date -d $start +%Y%m%d)
    end=$(date -d $end +%Y%m%d)

    while [[ $start -le $end ]]
    do
            tmux new -s $start
            start=$(date -d"$start + 1 day" +"%Y%m%d")
            formatted_date=$(date -d $start +%m-%d-%Y)
            python -m my_python_script --analysis-date=$formatted_date
    done
}

call_runner_date_range '2016-12-31' '2019-08-15'

Я хотел бы изменить этот скрипт bash, чтобы открывать новый сеанс tmux для каждой даты (причина, по которой я хочу использоватьtmux позволяет контролировать журналы вывода), чтобы эти сценарии могли работать параллельно. Как я могу это сделать, и есть ли предпочтительная альтернатива использованию tmux?

1 Ответ

0 голосов
/ 18 октября 2019

Чтобы запустить процесс в фоновом режиме, используйте & в качестве завершающего символа команды. Используйте >, чтобы перенаправить стандартный вывод процесса в файл. Для справки вы можете увидеть bash manual Список команд или bash manual redirections , но многие ресурсы доступны онлайн.

Таким образом, сценарий просто станет:

call_runner_date_range() {
    start=$1
    end=$2

    start=$(date -d $start +%Y%m%d)
    end=$(date -d $end +%Y%m%d)

    while [[ $start -le $end ]]
    do
            start=$(date -d"$start + 1 day" +"%Y%m%d")
            formatted_date=$(date -d $start +%m-%d-%Y)
            python -m my_python_script --analysis-date=$formatted_date > log_$start.log &
    done
}

call_runner_date_range '2016-12-31' '2019-08-15'

Вы можете использовать встроенную оболочку wait для ожидания всех в настоящее время все еще работающих фоновых процессов в текущей оболочке bash. Или вы можете сохранить каждый PID идентификатора фонового процесса, используя $! и указать список пидов, которых вы хотите ждать.

childs=() # bash array, initializing to empty

# then later:
python -m my_python_script --analysis-date=$formatted_date > log_$start.log &
childs+=($!)  # append the background jobs pids name to bash array

# then later
wait "${childs[0]}" # wait for first background job in childs array
wait "${childs[@]}" # wait for all background jobs in childs array

Обратите внимание, что вас может заинтересовать использование xargs который может (в большинстве реализаций) выполнять команды параллельно для каждой строки ввода или для GNU parallel, который является просто инструментом оболочки для параллельного выполнения нескольких заданий.

...