我试图通过xargs并行运行一系列命令。 我在文件cmd_list.txt创build了一个以空分隔的命令列表,然后试图按如下方式与6个线程并行地运行它们:
cat cmd_list.txt | xargs -0 -P 6 -I % bash -c %
但是,我得到以下错误:
bash: line 0: fg: no job control
我已经缩小了与命令列表中各个命令的长度有关的问题。 下面是一个人为的长命令下载一个图像的例子:
mkdir a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8 wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://img.zgserver.com/linux/accordion.jpg
只要自己运行wget命令,没有文件列表和没有xargs ,工作正常。 但是,在bash命令提示符下运行此命令(再次,没有文件列表)失败,并出现no job control error :
在命令不执行
sh中的“&>>”在Ubuntu 16.04.2和Fedora 24中performance方式各不相同
在特定的时间运行一个命令
如何在bash中绑定一个sigkill的密钥?
echo "wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://img.zgserver.com/linux/accordion.jpg" | xargs -I % bash -c %
echo "wget --no-check-certificate --no-verbose -O /tmp/blah.jpg http://img.zgserver.com/linux/accordion.jpg" | xargs -I % bash -c %
xargs有一个-s (size)参数,可以改变命令行长度的最大值,但我试图将其增加到荒谬的大小(例如16000),没有任何影响。 我认为这个问题可能与传递给bash -c的string的长度有关,但是下面的命令也没有问题:
bash -c "wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://img.zgserver.com/linux/accordion.jpg"
我知道有其他选项可以并行运行命令,比如parallel命令( https://stackoverflow.com/a/6497852/1410871 ),但是我仍然对修复我的设置非常感兴趣,或者至less弄清楚了哪里出问题了
我在Mac OS X 10.10.1(优胜美地)。
具有多个参数的xargs
Libpurple不从bash工作
如果发现有问题,只能发送电子邮件
bash:将数据导入exec'd命令
看起来解决方法是避免xargs的-I参数,根据OS X xargs手册页 ,对替换字符串的限制是255字节。 相反, -J参数可用,它不具有255字节的限制。
所以我的命令看起来像:
echo "wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://img.zgserver.com/linux/accordion.jpg" | xargs -J % bash -c %
但是,在上面的命令中,只有第一个空白之前的替换字符串部分被传递给了bash,所以bash试图执行:
wget
这显然会导致错误。 我的解决方案是确保xargs将命令解释为空分隔符而不是使用空格分隔使用-0参数,如下所示:
echo "wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://img.zgserver.com/linux/accordion.jpg" | xargs -0 -J % bash -c %
最后,这个作品!
感谢@CharlesDuffy提供了这个见解的大部分内容。 而且不用感谢我的OS X版本的xargs因为它处理超过255字节限制的替换字符串。
我怀疑这是百分比符号,而你的顶级外壳抱怨。
cat cmd_list.txt | xargs -0 -P 6 -I%bash -c%
百分比是作业控制的元字符。 “fg%2”,例如“kill%4”。
尝试使用反斜杠转义百分比,告诉上层shell不应该尝试解释百分比,xargs应该是一个字面百分比字符。
cat cmd_list.txt | xargs -0 -P 6 -I %bash -c %
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。