web-dev-qa-db-ja.com

エラー時にxargsが終了しないようにする

Manページによると、実行行の1つがエラー255で終了すると、xargsは終了します。

コマンドの呼び出しがステータス255で終了した場合、xargsはそれ以上の入力を読み取らずに直ちに停止します。これが発生すると、エラーメッセージがstderrに発行されます。

Xargsをnotに取得するにはどうすればよいですか?

一度に実行したい1500行程度のバッチジョブがあり、一度に50行実行します。私はそれが特定のラインで常に死んでいることを発見し、仕事を完了しませんでした。良くない!

さらに良い質問は、私が何をしようとしているのかを説明する質問です:

1500行のバッチスクリプトを一度に50行実行して、途中でジョブが終了せず、出力が一部のログファイルにキャプチャされるようにするにはどうすればよいですか?種類?

29
JDS

Perlスクリプトを別の単純なbashスクリプトでラップすることができます。

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

これはreal-commandを呼び出し、これに渡すすべてのパラメーターを渡しますfake-commandで、常に0の終了コードを返します(つまり、常に成功します)そして、xargsはこれで止まることはありません。

12
user842313

larsks回答に似ていますが、より明確です:

xargs sh -c "somecommand || true"
26
Filippo Vitale

コマンド行の戻りコードをマスクするxargs呼び出しを作成できます。次のようなものを使用すると、xargssomecommandによって終了コードが返されることはありません。

xargs sh -c "somecommand || :"
9
larsks

これの面白い答えを見つけましたが、その有用性は実行しようとしているコマンドによって異なります。

基本的にコマンドのリストを組み立てるために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
7
matschaffer

xargsfindと一緒に使用していた場合は、-exec代わりにfindのオプション:

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

私のために次の建設工事:

ls | xargs -I % svn upgrade %

一部の要素でsvn upgradeが失敗した場合でも、プロセスは続行されました

4
AndreyP