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


27

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

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

これを行わないようにxargsを取得するにはどうすればよいですか?

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

さらに良い質問、私がやろうとしていることを説明する質問は次のとおりです。

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

回答:


12

perlスクリプトを別の単純なbashスクリプトでラップできます。

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

これは、このコマンドに渡すすべてのパラメーターを渡す実コマンドを呼び出し、常に0終了コードを返します(常に成功することを意味します)。xargsはこれで停止しません。



9

xargs呼び出しを記述して、コマンドラインのリターンコードをマスクすることができます。次のような場合、xargs終了コマンドがsomecommandによって返されることはありません。

xargs sh -c "somecommand || :"

私は良い解決策を思いつきました:処理中のコマンドが255ステータスで終了しないようにしてください! 追加の詳細 処理中のコマンドはPerlスクリプトです。Perlのdie()関数は、重大なエラー(データベースに接続できなかったなど)が発生した場合に終了するために、いくつかの場所で使用されていました。ただし、die()は常にエラーステータス255で終了します。この場合の解決策は、die()をprintとexit()の組み合わせで置き換えることで、より合理的なエラーコード(この場合は「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

あなたが使用していた場合xargsfind、使用-execするオプションfindの代わりに:

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

1
ハウディ。私は、しかし、-execオプションは、道がxargsのをすることができます使用して操作を並列化していないことを使用することができます
JDS

2
ありがとう- xargsコマンドを並行して実行できるとは知りませんでした。クール。コマンドの呼び出し回数を最小限に抑えたい場合-execは、+パラメーターを使用します。
ロジャーダー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.