【发布时间】:2023-03-24 08:53:01
【问题描述】:
我有一个 .sh,它从 .txt 中读取,用作另一个 shell 脚本的参数。每两行并行处理。 目前:我当前的代码将读取文件中的所有行(一次 2 行)用于第一个 .sh 调用,然后读取所有行用于第二个 .sh 调用,然后 ALL 用于最后一个 .sh 调用
问题:我需要在第一个 .sh 中的前两行,然后是第二个 .sh,然后是最后一个 .sh..THEN 循环并处理接下来的两行 HHEEELLLPPP !!! :)
现在:
cat XXXXX.txt | while read line; do
export step=${line//\"/}
export step=ExecuteModel_${step//,/_}
export pov=$line
$dir"/hpm_ws_client.sh" processCalcScriptOptions "$appName" "$pov" "$layers" "$stages" "" "$stages" "$stages" FALSE > "$dir""/"$step"_ProcessID.log"
$dir_shell_model"/check_process_status.sh" "$dir" "$step" > "$dir""/""$step""_Monitor.log" &
$dir"/hpm_ws_client.sh" processCalcScriptOptions "$appName" "$pov" "$layers" "" "" "$stage_final" "" TRUE > "$dir""/""$step""_ProcessID.log"
$dir"/check_process_status.sh" "$dir" "$step" > "$dir""/""$step""_Monitor.log" &
$dir"/hpm_ws_client.sh" processGenealogyExecutionPaths "$appName" "$pov" "$layers" "$genPath_01" > "$dir""/""$step""_ProcessID.log"
$dir"/check_process_status.sh" "$dir" "$step" > "$dir""/""$step""_Monitor.log" &
if (( ++i % 2 == 0))
then
echo "Waiting..."
wait
fi
done
【问题讨论】:
-
很难看出你在做什么——你能简化它并显示你试图阅读的文件。在我看来,这样做的方法是使用
GNU Parallel,它可以从一个或多个输入文件中读取 1 个或多个参数,并一次处理任意多个参数。它可能会删除你所有的循环并使你的代码小几倍——我猜总共大约 3-5 行——而且更高效、更易读。 -
@MarkSetchell,我倾向于在 GNU Parallel 之前很久就建议使用 GNU xargs
-P标志——更简单的实现(当与-0或-d $'\n'一起使用时,以避免与与 POSIX 中一些考虑最差的部分兼容),在“显然没有错误”与“没有明显错误”的意义上。 -
切线,所有
exports 是怎么回事?快速浏览一下,这些变量都不需要导出,除非您调用的工具需要它们;但可以肯定的是,没有什么需要多次导出。 -
@tripleee 导出用于定义各种进程的日志文件的名称......这些工具也需要它们,这只是一个更大的难题...... .我不太关心的那部分,我只是想在前两个并行执行完成时串行处理 TRANSFER DATA shell,这由 check_process_status.sh 跟踪
-
澄清一下....这可行,但是它们都是并行的,这将导致TRANSFER DATA的执行失败,因为我们使用的工具一次只能处理一个传输(尽管它可以同时处理多个执行...我知道,疯狂!)
标签: linux bash shell parallel-processing ampersand