Webサイトやシステムの運用作業の中で、よく tar コマンドを使います。 これは非常に便利なコマンドで、ディレクトリを丸ごと固めてくれ、なんなら圧縮もしてくれます。 zip でいいじゃないか zip で、という向きもあろうかと思いますが、Unix 系の OS では伝統的に tar が使われており、圧縮形式も gzip が良く使われています。

よくあるエラー

tar cvzf public_html.20190918.tar.gz public_html

などのコマンドを実行すると、たまに標題のエラーが発生することがあります。
※コマンドの説明省略

tar: Exiting with failure status due to previous errors

直訳すると、「さっき発生したエラーで処理を中断しました」といった感じです。

さっきと言われましても・・・さっきまで絶好調で tar コマンドが実行されていました。 こんな感じでログを表示しながら 。

public_html/img/D1550FD.jpg
public_html/img/L1-20DT.jpg
public_html/img/delivery.html
public_html/img/B7001DT.jpg
public_html/img/YM1601D.jpg
public_html/img/YM1502D.jpg
public_html/img/L1501.jpg
public_html/img/L1500DT.jpg
public_html/img/B7000DT.jpg
public_html/img/YM2210D.jpg
public_html/img/B1500.jpg
public_html/img/SD2040D.jpg
tar: Exiting with failure status due to previous errors

「さっき発生したエラー」はどこにも見当たりません。Google でエラーメッセージを検索するなどすると、読み取り権限の無いファイルがある場合にこのエラーが発生することがありますよ、という情報をちらほらと見かけます。

その、読み取り権限の無いファイルを探すために、

find . perm 000

とかやれば、権限の無いファイルを見つけられるよ、とも書かれています。

そうですね、そうかもしれません。

しかしたまたま、この間触っていたサーバーは実行でいるコマンドが制限されており、find は実行できませんでした。

どうしたものか・・・原因のファイルはどこにあるのか・・・

対応策

と思っていたら、このような情報を見つけました。

The tar
 command should actually print out what those “previous errors” are, but you can easily miss printed error messages if you run tar
 in verbose mode (e.g., -cvf).

http://ask.xmodulo.com/tar-exiting-with-failure-status-due-to-previous-errors.html

「オプションにvをつけてログを出力させていると、エラー出力されているけど流れていって見逃してしまうよ」

ということのようです。

そして解決策は

 tar cvfz backup.tgz my_program/ > /dev/null

という風に標準出力を /dev/null に捨てればエラーだけ出力させられるということです。

原因が読み取り権限にあるのかどうか分からないまま find で探すより、正しいエラー原因が分かった方がいいですしね。