在 bash 中启动多个 tmux 会话

Spinning up multiple tmux sessions in bash

我有一个 python 脚本,my_python_script 需要输入日期。 我有一个 bash 脚本,它在 for 循环中为一系列日期调用此 python 脚本。我尝试在 for 循环中创建一个命名会话,但这会嵌套 tmux 会话:

call_runner_date_range() {
    start=
    end=

    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 更好的替代方法?

要在后台启动进程,请使用 & 作为命令的终止符。使用 > 将进程的标准输出重定向到文件。作为参考,您可以查看 bash manual List of commands or bash manual redirections,但网上有很多资源。

所以脚本会变成:

call_runner_date_range() {
    start=
    end=

    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 that can (on most implementations) execute commands in parallel for each line of input or the amazing GNU parallel 感兴趣,它只是一个 shell 工具,可以尽可能轻松地并行执行多个作业。