防止 xargs 因错误退出

防止 xargs 因错误退出

根据手册页,如果其中一条执行行出现 255 错误,xargs 将退出:

如果任何命令调用以 255 的状态退出,xargs 将立即停止,不再读取任何输入。发生这种情况时,stderr 上会发出错误消息。

我怎样才能让 xargs不是做这个?

我有一个大约 1500 行的批处理作业需要运行,每次运行 50 行。我发现它总是在某一行死机,无法完成作业。真不好!

一个更好的问题,描述我正在尝试做的事情的问题是:

我如何才能运行一个 1500 行的批处理脚本,每次 50 行,以便它不会在中途退出作业,并且输出会被捕获到某种日志文件中?

答案1

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

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

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

答案2

与答案类似larsks但更明确:

xargs sh -c "somecommand || true"

答案3

刚刚发现了一个有趣的答案,但它的实用性取决于您尝试运行的命令。

如果您使用 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 upgrade 在某些元素上失败,进程仍会继续

相关内容