tar -xvzf $ファイル名.tar.gz || { 終了 $?; }
ここで私のスクリプトは errorCode 141 で終了します。Fedora Core 6 と tar バージョン 1.15 を使用しています。
常に発生するわけではありませんが、70% 以上の確率で失敗します。
tar -xvzf $ファイル名.tar.gz || { 終了 $?; }
ここで私のスクリプトは errorCode 141 で終了します。Fedora Core 6 と tar バージョン 1.15 を使用しています。
常に発生するわけではありませんが、70% 以上の確率で失敗します。
このスレッドが数年以上前のものであることは認識していますが、エラーでこのスレッドに出くわした人のためにコメントしています。
圧縮オプションを使用する場合は常に、tar はパイプを使用して基になるプログラムへの接続を暗黙的に開きます。したがって、OP の example:tar -xvzf $filename.tar.gz
では、tar が実際に行うことは、これに似たものを実行することです: gunzip $filename.tar.gz | tar -xv -
。を実行するtop
と、これを確認できます。2 つのプロセス (tar 用と gzip 用) が表示されます。
ただし、パイプライン自体が壊れることもあります。たとえば、ファイルが gzip ファイルでない場合。これを例に取ります: tar -xvzf somefile.iso
、これは と同等gunzip somefile.iso | tar -xv -
です。このような状況では、gzip はエラーになります。gzip でエラーが発生すると、パイプラインが壊れます。別の可能性として、gzip ファイルは正しいが、その中の tar ファイルが破損している可能性があります。この場合、gzip は圧縮されていないストリームを tar に送信し始めますが、tar は何かがおかしいことに気づき、ストリームを閉じます。出力が閉じられているため、ここで gzip を実行するとエラーが発生します。
終了値では、128 を超える値はシグナルによる終了を示し、128 を超える値は終了の原因となったシグナルを示します。したがって、OP の終了コード 141 から 128 を引くと、13 が得られます。これは、SIGPIPE (man 7 signal
標準シグナルとそれに対応する整数値のリスト) に対応します。
man ページには、SIGPIPE のコメントが「壊れたパイプ: リーダーなしでパイプに書き込む」としてリストされています。そのため、gzip がパイプに書き込もうとしているように見えますが、tar はリッスンを停止しています。私の推測では、gzip はファイルを正常に解凍していますが、解凍されたストリームは有効な tar アーカイブではありません。ここでの私のアドバイスは、ファイルに対して gunzip を実行してから、結果ファイルに対して tar を実行し、どれが失敗するかを確認することです (SIGPIPE に基づいて、tar は失敗すると思います)。どちらの場合も、これらのバージョンのツールではファイルを読み取ることができないようです (破損または何らかのバージョンの競合)。
これらのファイルはどのように作成されましたか (tar のオプションなど)? このマシンまたは別のマシンで作成されていますか? このマシンで .tar.gz ファイルを作成した場合、同じマシンでそれらのファイルをエラーなしで抽出できますか?
GNU tar はいくつかのものを返すだけで、どれも -141 ではありません。ただし、gzip などのサブプロセスを実行していて、そのプロセスが異常終了した場合は、そのリターン コードが返されます。
ただし、サブプロセスが何であったかはわかりません。試してみて--verbose
、手がかりが得られるかどうかを確認してください。
回避策として、現在、アーカイブにcpioを使用しています。これは、現在は問題なく機能しますが、tarがこの問題を引き起こしている理由、長い間、標準ツールとして長年使用されている理由を知りたいと思います。