サーバー

【Linux】tarの戻り値

Linuxコマンドで使用されているtarにてtarファイルを作成するシェルスクリプトを作成したのですが、あるファイルを実行すると戻り値が0ではなく1でかえってくることがありました。

tarのバージョン

[text]
$ tar --version
tar (GNU tar) 1.23
Copyright (C) 2010 Free Software Foundation, Inc.
使用許諾 GPLv3+: GNU GPL version 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

[参考訳]
これはフリーソフトウェアです. 変更と再配布は自由です.
法律で認められる範囲で「無保証」です.

作者: John Gilmore, Jay Fenlason.[/text]

Shellスクリプト

[shell]
#!/bin/sh
tar cvfz /tmp/test.tar.gz /var/log/***.log
echo "exit code = $?"
[/shell]

単純にtarで圧縮して結果をechoで出力しています。

実行結果

通常の場合

[text]/tmp/test.sh
tar: メンバ名から先頭の `/' を取り除きます
/var/log/***.log
exit code = 0[/text]

失敗する場合

[text]/tmp/test.sh
tar: メンバ名から先頭の `/' を取り除きます
/var/log/***.log
tar: /var/log/***.log: 読み込んだファイルが変更されています
exit code = 1[/text]
[text]
/tmp/test.sh
tar: メンバ名から先頭の `/' を取り除きます
tar: /var/log/***.log: stat 不能: そのようなファイルやディレクトリはありません
tar: 前のエラーにより失敗ステータスで終了します
exit code = 2
[/text]

どうやらファイル圧縮中にファイルの内容が変更された場合は1、削除された場合は2を返すようです。

マニュアル

こちらにて戻り値について記載されていました。

Possible exit codes of GNU tar are summarized in the following table:

0

`Successful termination'.

1

`Some files differ'. If tar was invoked with `--compare' (`--diff', `-d') command line option, this means that some files in the archive differ from their disk counterparts (see section Comparing Archive Members with the File System). If tar was given `--create', `--append' or `--update' option, this exit code means that some files were changed while being archived and so the resulting archive does not contain the exact copy of the file set.

2

`Fatal error'. This means that some fatal, unrecoverable error occurred.

ファイル圧縮中に起こった変更はは警告として表示しているようです。

対策

単純にexit codeが0、1以外をエラーとする設定に変更すればいいと思います。

[shell]
#!/bin/sh
tar cvfz /tmp/test.tar.gz /var/log/***.log
exitcode=$?
if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then
#エラー処理
fi
[/shell]

標準出力には【tar: /var/log/***.log: 読み込んだファイルが変更されています】等の警告が表示される場合があります。

標準出力から警告メッセージを非表示にする場合は--warningで対応することでいけるようです。

[shell]tar -cvfz --warning=no-file-changed /tmp/test.tar.gz /var/log/***.log[/shell]

※warningをつける際はcvfzもマイナス【-】をつけないとうまく動かないです。

warningのオプションはこちらから参照できます。

 

-サーバー
-, ,

© 2020 かえでBlog