上一个
这是this问题的后续。
规格
我的系统是一个运行ubuntu桌面的专用服务器,版本12.04(精确)64位,3.14.32-xxxx-std-ipv6-64。发行版和内核都不能升级,但我可以安装任何软件包。
问题
上面问题中描述的问题似乎已经解决了,但这对我不起作用。我已经安装了最新的lftp和并行软件包,它们看起来对自己很好。
运行lftp
可以正常工作。
运行./job.sh ftp.microsoft.com
很好,但我需要chmod -x
脚本
运行sed 's/|.*$//' end_unique.txt | xargs parallel -j20 ./job.sh :::
不起作用,并以/bin/bash: <server>: command not found.
的形式产生bash错误
为了简化,我清理了输入文件end_unique.txt
,现在每行的格式如下:
<server>
每一行以crlf结尾,因为它是从windows服务器导入的。
编辑1:
这是job.sh脚本:
#/bin/sh
server="$1"
lftp -e "find .; exit" "$server" >"$server-files.txt"
编辑2:
我拿了这个文件,对fromdos进行了测试。现在它应该是标准的unix格式,每行一个服务器。请记住,文件中的服务器的格式可能会有所不同:
ftp.server.com
www.server.com
server.com
123.456.789.190
所有这些服务器都是ftp服务器,可通过
ftp://<serverfromfile>/
访问。 最佳答案
对于:::
,parallel
需要参数列表来完成要在命令行上显示的命令,如
parallel -j20 ./job.sh ::: server1 server2 server3
如果没有
:::
它就会从stdin读取参数,这在本例中对我们更有帮助。你可以简单地说parallel -j20 ./job.sh < end_unique.txt
附录:可能出错的地方
确定两件事:
您使用的是gnu
parallel
而不是另一个版本(例如moreutils
中的版本),因为只有(据我所知)gnu版本支持从stdin读取参数列表,并且gnu parallel没有配置为禁用gnu扩展。结果,在评论中经过长时间的讨论后,他们在Ubuntu12.04上被默认禁用,所以在其他地方(特别是Ubuntu12.04的下游)可能会发现这种情况并非不可想象。这样的配置可以隐藏在
环境变量
$PARALLEL
,/etc/parallel/config
或~/.parallel/config
如果gnu版本的
parallel
对您不可用,并且如果您的参数列表对于shell来说不太长,并且其中的任何参数都不包含空格,那么moreutilsparallel
的相同之处是parallel -j20 job.sh -- $(cat end_unique.txt)
这对op不起作用,因为该文件包含的服务器比shell希望放入命令行的服务器要多,但它可能对其他有类似问题的服务器起作用。
关于linux - Bash:使用xargs从文件读取参数时出现意外的并行行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30823870/