现在如何
我目前有一个在Windows下运行的脚本,它经常从服务器列表中调用递归文件树。
我使用AutoIt(作业管理器)脚本执行30个lftp(仍然是windows)的并行实例,这样做:
lftp -e "find .; exit" <serveraddr>
用作作业管理器输入的文件是纯文本文件,每行的格式如下:
<serveraddr>|...
其中“......”是不重要的数据。我需要运行多个lftp实例才能获得最大性能,因为单实例性能取决于服务器的响应时间。
每个lftp.exe实例将其输出通过管道传输到名为
的文件<serveraddr>.txt
如何
现在我需要将这一切都移植到Linux(Ubuntu,安装了lftp)专用服务器上。从我之前的,非常(!)有限的linux经验来看,我想这很简单。
我需要写什么以及什么?例如,我是否还需要一个job man脚本,还是可以在一个脚本中完成?我如何从文件中读取(我想这将是简单的部分),以及如何保持最大值。运行30个实例(甚至可能超时,因为极无响应的服务器可能会阻塞队列)?
谢谢!
答案 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
。