在bash中启动多个tmux会话

时间:2019-10-18 15:32:09

标签: bash tmux

我有一个Python脚本my_python_script,该脚本需要输入日期。 我有一个bash脚本,它在for循环内调用此python脚本获取一系列日期。我尝试在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 :(得分:0)

要在后台启动进程,请使用&作为命令的终止符。使用>将流程的标准输出重定向到文件。作为参考,您可能会看到bash manual List of commandsbash 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内置的shell等待当前bash shell中所有当前仍在运行的后台进程。或者,您可以使用$!保存每个后台作业进程ID PID,并指定要等待的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(它只是一个Shell工具来并行执行多个作业)尽可能简单。

相关问题