![我需要让文件的每一行在其自己的子 shell 中运行](https://linux22.com/image/218001/%E6%88%91%E9%9C%80%E8%A6%81%E8%AE%A9%E6%96%87%E4%BB%B6%E7%9A%84%E6%AF%8F%E4%B8%80%E8%A1%8C%E5%9C%A8%E5%85%B6%E8%87%AA%E5%B7%B1%E7%9A%84%E5%AD%90%20shell%20%E4%B8%AD%E8%BF%90%E8%A1%8C.png)
我有一个运行良好的脚本,但按系列运行。
我想让脚本从文本文件中获取每一行并在子 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 中运行每一行。