防止xargs因错误退出


27

根据手册页,如果执行行之一以错误255退出,则xargs将退出:

如果以状态255退出命令的任何调用,则xargs将立即停止,而无需读取任何进一步的输入。发生这种情况时,将在stderr上发出错误消息。

如何获得xargs 这样做?

我有一个要运行的大约1500行批处理作业,一次要运行50行。我发现它总是快要死了,而没有完成工作。不好!

更好的问题是描述我要做什么的问题:

我如何一次运行1500行批处理脚本,一次运行50行,这样它就不会在中间退出该作业,并且将输出捕获到某种日志文件中?

Answers:


12

您可以用另一个简单的bash脚本包装perl脚本:

#!/bin/bash
real-command "$@" || exit 0

这将调用实命令,将您传递给该假命令的所有参数传递给该实命令,并且该命令将始终返回0退出代码(这意味着它总是成功的),并且xargs将永远不会停止。



9

您可以编写xargs调用来掩盖命令行的返回代码。使用以下内容,xargs将永远不会看到somecommand返回退出代码:

xargs sh -c "somecommand || :"

我想出了一个很好的解决方案:确保正在处理的命令不会以255状态退出! 其他详细信息 正在处理的命令是Perl脚本。如果发生一些严重错误(例如,无法连接到数据库),则在多个地方使用Perl die()函数退出。但是,die()始终以错误状态255退出。在这种情况下,解决方案是用print和exit()的组合替换die()以及更合理的错误代码(在这种情况下,“ 1”有效)。
JDS

6

刚刚找到了一个有趣的答案,尽管它的用处取决于您要运行的命令。

如果您使用xargs基本上汇编命令列表,则可以通过告诉xargs回显该命令,然后通过管道传递到bash来获得此行为。

例如,如果您要删除可能存在或不存在的事物的列表:

# presume this will fail in a similar way to your command
cat things_to_delete | xargs -n1 delete_command_that_might_exit

# instead echo the commands and pipe to bash
cat things_to_delete | xargs -n1 echo delete_command_that_might_exit | bash

之所以有效,是因为,首先,xargs仅调用echo,因此不会看到任何错误。其次,因为bash的默认行为是在失败的语句后继续执行。

为了更具体地说明我的情况,我使用它来从AWS ElasticBeanstalk中删除一堆旧应用程序版本,如下所示:

aws elasticbeanstalk describe-application-versions --application-name myapp |\
jq -r '.ApplicationVersions | sort_by(.DateCreated) | .[0:-10] | .[].VersionLabel' |\
xargs -n1 \
  echo aws elasticbeanstalk delete-application-version \
       --delete-source-bundle --application-name myapp --version-label |\
bash

4

以下施工为我工作:

ls | xargs -I % svn upgrade %

即使svn升级在某些元素上失败,该过程仍在继续


3

如果您使用xargswith find,请使用-exec选项find代替:

find . -name '*.log' -exec somecommand {} \;

1
你好。我可以使用,但使用可以xargs的-exec选项不并行操作的方式,确实
JDS

2
谢谢-我不知道那xargs可以并行运行命令。凉。如果只想减少命令调用的次数,则-exec有一个+参数。
罗杰·达尔2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.