我有一个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的替代方法吗?
答案 0 :(得分:0)
要在后台启动进程,请使用&
作为命令的终止符。使用>
将流程的标准输出重定向到文件。作为参考,您可能会看到bash manual List of commands或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
内置的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工具来并行执行多个作业)尽可能简单。