tar の “file changed as we read it” エラーの回避方法
tar コマンドでアーカイブするようなスクリプトを実行しているとき、アーカイブ中にファイルが変更されるとエラーとなります。
たとえばcronでログファイルのアーカイブ中に
1 2 3 |
tar: var/log/test.log: file changed as we read it |
のようにエラーが出ます。日本語環境だと
1 2 3 |
tar: var/log/test.log: 読み込んだファイルが変更されています |
というエラーメッセージが出ます。
このメッセージを抑止するには、tar コマンド実行時に --warning=no-file-changed
のオプションを追加します。
1 2 3 |
tar czvf test.tar test.log --warning=no-file-changed |
同様にファイルが削除されたときには
1 2 3 |
tar: File removed before we read it |
というワーニングが出ますので --warning=no-file-removed
のオプションを付ければ抑止できます。
また、ファイルがローテーションなどで切り捨てられたときには、
1 2 3 |
tar: test.log: 67700368 バイト小さくなったので、ゼロで埋めます |
1 2 3 |
tar: test.log: File shrank by 111937258 bytes; padding with zeros |
のようなメッセージが出ますので、--warning=no-file-shrank
のオプションを追加します。
1 2 3 |
tar czvf test.tar test.log --warning=no-file-changed --warning=no-file-removed --warning=no-file-shrank |
上記のように複数指定するのが良いと思います。
ただし、上記の指定はワーニングを消すだけで、tar コマンドの戻り値は 1 のままです。
回避策としては、tar コマンドは致命的なエラーでは 2 が戻りますので、バックアップなどのスクリプト中では戻り値 0, 1 は処理続行として扱うなどの工夫が必要です。
1 2 3 4 5 6 7 8 |
tar czvf example.tar.gz /var/log/httpd --warning=no-file-changed --warning=no-file-removed --warning=no-file-shrank code=$? if [ $code -ne 0 -a $code -ne 1 ]; then echo "Fatal Error" exit $code fi |
ITエンジニア募集中!
キュアコード株式会社はITエンジニアを募集しております。少人数の職場なので、上流・下流やサーバー・クライアント対応の垣根なく、あなたの強みを活かしながら いろいろなことにチャレンジ可能です。エンジニアとしての未経験の方、経験が少ない方も歓迎しています。
下記よりITエンジニア募集の採用情報をご覧いただけます。