web-dev-qa-db-ja.com

ls:xargsを使用している場合、シグナル13で終了

次のコマンドを使用して、フォルダー内の最大サイズの4つのファイルを削除しています。

find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d '\n' rm -f

それは正常に動作しますが、時々壊れたパイプエラーをスローします:

xargs: ls: terminated by signal 13
24
user1529918

私は同様の問題に出くわし、答えの検索でこのスレッドを見つけました:

シグナル13は、パイプから何かが読み取られ、そこから何も読み取られないことを意味します(例: http://people.cs.pitt.edu/~alanjawi/cs449/code/Shell/UnixSignals.htm を参照) 。

ここでのポイントは、xargsによって実行されるlsコマンドは、次のheadコマンドが必要な入力をすべて取得し、入力パイプを閉じたときに、まだ出力を書き込んでいるということです。したがって、無視しても安全ですが、見苦しいです。 https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error で受け入れられている回答も参照してください

27
planetmaker

プログラムをhead -n 4で意図的に終了します。これにより、「呼び出し元」が終了する前に終了したため、破損したパイプが作成されます。これはあなたが期待していることなので、それを破棄する/dev/nullにリダイレクトすることでエラーを無視できます:

find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d '\n' rm -f 2>/dev/null

6
David Espart

さまざまな状況下で、「シグナル13で終了」という同じエラーが発生しました。ここでの他の回答は、修正に役立ちました。問題の性質について詳しく説明します。

corpy386 ~/gw/Release/5.1_v9/ClaimCenter $ find . -name '*.pcf' -not -name '*build*' | xargs grep -l ClaimSnapshotGeneralPanelSet | ( read f && echo $f && grep 'def=' $f )
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.auto.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
xargs: grep: terminated by signal 13

したがって、ここに同じエラーがあり、探しているものに一致する多数のファイルがあることを知っていたときに、出力が1行だけ表示されます。問題は、xargsが複数行の出力を生成し、readが終了する前に1行しか消費しないことでした。 xargsは残りの結果をパイプの1つに書き込もうとしますが、受信側は既に終了して帰宅しています。したがって、シグナル13:Broken Pipe。

修正は、ループによってxargsのすべての出力を消費することでした-read f && do_some_things(一度だけ読み取ります)をwhile read f; do do_some_things; doneに変更します。

corpy386 ~/gw/Release/5.1_v9/ClaimCenter $ **find . -name '*.pcf' -not -name '*build*' | xargs grep -l ClaimSnapshotGeneralPanelSet | while read f; do echo $f; grep 'def=' $f; done**
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.auto.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.gl.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Pr.pcf
      def="ClaimSnapshotGeneralPRPanelSet(Claim, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Trav.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.wc.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotLossDetailsScreen.default.pcf
      def="ClaimSnapshotGeneralPanelSet(Claim, SnapshotParam)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.auto.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.gl.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Pr.pcf
      def="ClaimSnapshotGeneralPRPanelSet(Claim, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Trav.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.wc.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotLossDetailsScreen.default.pcf
      def="ClaimSnapshotGeneralPanelSet(Claim, SnapshotParam)"

これは、OPのスクリプトとまったく同じ状況ではありません-彼らは入力の一部を望んでいて、意図的にそれを切り取りました。プログラムは、受信者がまだリッスンしているかどうかをテストするのではなく、すべての入力を消費するまで実行し続けるように記述されている傾向があります

0
gws