Bash:循环遍历文件并读取子字符串作为参数,执行多个实例

时间:2015-06-13 02:48:09

标签: linux bash ubuntu lftp

现在如何

我目前有一个在Windows下运行的脚本,它经常从服务器列表中调用递归文件树。

我使用AutoIt(作业管理器)脚本执行30个lftp(仍然是windows)的并行实例,这样做:

lftp -e "find .; exit" <serveraddr>

用作作业管理器输入的文件是纯文本文件,每行的格式如下:

<serveraddr>|...

其中“......”是不重要的数据。我需要运行多个lftp实例才能获得最大性能,因为单实例性能取决于服务器的响应时间。

每个lftp.exe实例将其输出通过管道传输到名为

的文件
<serveraddr>.txt

如何

现在我需要将这一切都移植到Linux(Ubuntu,安装了lftp)专用服务器上。从我之前的,非常(!)有限的linux经验来看,我想这很简单。

我需要写什么以及什么?例如,我是否还需要一个job man脚本,还是可以在一个脚本中完成?我如何从文件中读取(我想这将是简单的部分),以及如何保持最大值。运行30个实例(甚至可能超时,因为极无响应的服务器可能会阻塞队列)?

谢谢!

1 个答案:

答案 0 :(得分:1)

并行处理

我使用GNU / parallel。默认情况下不会分发它,但可以从默认软件包存储库为大多数Linux发行版安装。它的工作原理如下:

https://ellislab.com/codeigniter/user-guide/general/routing.html

将并行执行parallel echo ::: arg1 arg2 echo arg1

所以最简单的方法是创建一个脚本,用bash / perl / python同步你的服务器 - 无论你喜欢什么 - 并执行它:

echo arg2

脚本可能如下所示:

parallel ./script ::: server1 server2

#!/bin/sh #$0 holds program name, $1 holds first argument. #$1 will get passed from GNU/parallel. we save it to a variable. server="$1" lftp -e "find .; exit" "$server" >"$server-files.txt" 似乎也适用于Linux,因此您无需更改FTP客户端。

最大限度地运行每次30个实例,传递lftp,如下所示:-j30

读取文件列表

现在如何将包含parallel -j30 echo ::: 1 2 3条目的规范文件转换为GNU /并行参数?简单 - 首先,过滤文件以包含主机名:

<server>|...

sed 's/|.*$//' server-list.txt 用于使用正则表达式替换事物等等。这将在第一个sed之后删除所有内容(.*),直到结束行(|)。 (虽然$通常表示正则表达式中的替代运算符,但在sed中,它需要被转义才能工作,否则它只意味着|。)

所以现在你有了服务器列表。如何将它们传递给您的脚本? |xargs将每行放置为可执行文件的附加参数。例如

xargs

将运行

echo -e "1\n2"|xargs echo fixed_argument

所以在你的情况下你应该做

echo fixed_argument 1 2

注意事项

请确保不将结果保存到每个并行任务中的同一文件中,否则文件将损坏 - coreutils很简单,除非您自己实现,否则不会实现任何锁定机制。这就是为什么我将输出重定向到sed 's/|.*$//' server-list.txt | xargs parallel -j30 ./script ::: 而不是$server-files.txt

相关问题