我需要让文件的每一行在其自己的子 shell 中运行

我需要让文件的每一行在其自己的子 shell 中运行

我有一个运行良好的脚本,但按系列运行。

我想让脚本从文本文件中获取每一行并在子 shell 中运行/生成该行,然后移至下一行,依此类推。

我需要子 shell 有两个原因:
首先,让作业并行运行而不是串行运行,从而使其运行速度更快。
其次,监视给定命令的输出并从远程系统返回退出代码。

有谁知道我怎样才能做到这一点?

作为一点背景知识,文本文件的每一行都是在远程系统上运行的 ssh 命令的集合,其中包含从用户输入和另一个输入文件收集的选项、函数,因此脚本生成的输出中的每一行都是一个独立的服务器的命令。

我通过动作调用脚本/bin/bash $temp_file

脚本示例类似于:

sshpass -p <PASSWORD> ssh -o StrictHostKeyChecking=no -p 22 [email protected]  'cat /etc/hostname  ;echo 'START';echo `date +%Y-%m-%d` ; echo <PASSWORD> |sudo -S yum update -y; cat /etc/hostname ;echo 'FINISH';echo `date +%Y-%m-%d` ;echo '';echo ''

这只是一个示例,要运行的命令(例如yum update -y我在这里使用的 with echos 和 date)将被替换为单个命令或使用;$$来分隔它们。

我知道该行中有很多字符可能会导致问题。

答案1

GNU Parallel 就是为此而构建的:

parallel --joblog my.log < myfile.sh

--sshlogin/--sshloginfile--jobs N--tag--linebuffer和 可能--nonall也有用。您必须透露更多有关您想要运行的远程作业的信息,以确定哪些作业是相关的。

答案2

您只需阅读每一行并使用它eval来评估它。

IFS=""
while read -r line; do
   eval "( $line )"
done < command_file

执行您要求的最低限度,即在子 shell 中运行每一行。

相关内容